2016-04-14 11 views
0

İki veya daha fazla dizinin simetrik farkını içeren bir dizi bulmaya çalışırken bu codepen http://codepen.io/PiotrBerebecki/pen/ZWxvzm'u oluşturdum.Simetrik fark işlevimi biraz değiştirerek, bilinmeyen sayıda argümanı kabul etmesi mümkün mü?

İşlevim tamam çalışıyor, ancak yalnızca dört argüman geçilirse. İşlevimi, bilinmeyen sayıda bağımsız değişken kabul edebilecek şekilde nasıl değiştirebilirim? Belki de bir for döngüsünün veya reduce/reduce/ yöntemlerinin bir parçası olabilecek potansiyel olarak tekrarlanabilir bir kod bloğu vardır. Bunu nasıl başaracağımı anlayamıyorum. @Bergi ile ipuçları

symmetricDifference([1,2,3,4], [3,4,5,6], [2,4,6,7], [8,9]) 
// should return an array containing [1,4,5,7,8,9] 

symmetricDifference([1,2,3,4], [3,4,5,6]) 
// should return an array containing [1,2,5,6] 

var arrA = [1,2,3,4]; 
var arrB = [3,4,5,6]; 
var arrC = [2,4,6,7]; 
var arrD = [8,9]; 

function symmetricDifference(arr) { 
    let args = Array.prototype.slice.call(arguments); 
    let result = []; 

    result = args[0].concat(args[1]).filter(function(item) { 
    return args[0].indexOf(item) === -1 || args[1].indexOf(item) === -1; 
    }); 

    result = result.concat(args[2]).filter(function(item) { 
    return result.indexOf(item) === -1 || args[2].indexOf(item) === -1; 
    }); 

    result = result.concat(args[3]).filter(function(item) { 
    return result.indexOf(item) === -1 || args[3].indexOf(item) === -1; 
    }); 

    return result; 
} 
+1

Evet, 'ar'' üzerinde basit bir' for' döngü kullanın. Başarısız olsaydın lütfen bize teşebbüsünü göster. – Bergi

+1

İpucu: 'var result = args [0] ile başlayın;' – Bergi

+1

Her zaman dört kişilik gruplar halinde mi? Argümanlarınızı dört kişilik gruplar halinde gruplandırın, ardından bu grupları döngüleyin, örneğinizdeki gruptaki dört öğenin her birini seçin. – ste2425

cevap

1

sayesinde bir for döngü ve bağımsız değişkenlerin sayısı bilinmeyen kabul arzu edilen şekilde işlev şimdi çalışıyor var result = args[0]; bir başlangıç ​​değeri kullanıma sunduk. Bu uygulamayı göstermek için orijinal kod kutusunu (http://codepen.io/PiotrBerebecki/pen/ZWxvzm) güncelleştirdim.

function symmetricDifference(arr) { 
    let args = Array.prototype.slice.call(arguments); 
    let result = args[0]; 
    for (var i = 1; i < args.length; i++) { 
    result = result.concat(args[i]).filter(function(item) { 
     return result.indexOf(item) === -1 || args[i].indexOf(item) === -1; 
    }); 
    } 
    // remove duplicates and sort 
    return Array.from(new Set(result)).sort((a, b) => a - b); 
} 
+1

Döngününüzü "1" ile "args.length" arasında çalıştırmak daha kolaydır. Ayrıca 'temp' değişkenini tanıtmak için bir neden yoktur, sadece' sonuç 'üzerinde çalışabilirsiniz. – Bergi

+0

"Döngü" koşullarını yeni güncelledim ve ipuçlarına göre gereksiz "temp" değişkenini kaldırdım. Kod şimdi daha temiz görünüyor. Çok takdir edildi. –

İlgili konular