2017-02-27 4 views
-2

私は2つの配列apple = [1,5,10,15,20],bottle = [1,5,10,15,20,25]を使ってロダッシュまたは任意のjavascript関数を使用しています。より正確に言えば、 'apple'配列と 'bottle'配列を比較すると、すべての要素のリストが必要です。/オブジェクトの2つの配列javascriptを比較し、不一致の配列要素をアンダースコアまたはロダッシュを使用して新しい配列にスローする

+4

[ 'VARのC = _.difference(ボトル、リンゴ);'](https://lodash.com/docs/4.17.4#difference) – 4castle

答えて

1

reduce()filter()という独自の関数を作成することができます。

var apple = [1,5,10,15,20], bottle = [1,5,10,15,20,25] 
 

 
function diff(a1, a2) { 
 
    //Concat array2 to array1 to create one array, and then use reduce on that array to return 
 
    //one object as result where key is element and value is number of occurrences of that element 
 
    var obj = a1.concat(a2).reduce(function(result, element) { 
 
    result[element] = (result[element] || 0) + 1 
 
    return result 
 
    }, {}) 
 
    
 
    //Then as function result return keys from previous object where value is == 1 which means that 
 
    // that element is unique in both arrays. 
 
    return Object.keys(obj).filter(function(element) { 
 
    return obj[element] == 1 
 
    }) 
 
} 
 

 
console.log(diff(apple, bottle))

ES6矢印関数で同じコードのより短いバージョン。

var apple = [1,5,10,15,20], bottle = [1,5,10,15,20,25] 
 

 
function diff(a1, a2) { 
 
    var obj = a1.concat(a2).reduce((r, e) => (r[e] = (r[e] || 0) + 1, r), {}) 
 
    return Object.keys(obj).filter(e => obj[e] == 1) 
 
} 
 

 
console.log(diff(apple, bottle))

+0

はおそらく書きたいですもう少し自己文書化するコード.. – mhodges

+1

@mhodges私は私の答えを更新しました。 –

1

あなたは反対の配列のSetArray#filterを使用することができます。

この提案では、要素aがセットbにない場合はtrueを返す関数complementを使用します。

対称的な違いについては、コールバックによるフィルタリングを両側で使用する必要があります。

function getComplement(collection) { 
 
    // initialize and close over a set created from the collection passed in 
 
    var set = new Set(collection); 
 
    // return iterator callback for .filter() 
 
    return function (item) { 
 
     return !set.has(item); 
 
    }; 
 
} 
 
var apple = [1,5,10,15,20], 
 
    bottle = [1,5,10,15,20,25], 
 
    unique = [ 
 
     ...apple.filter(getComplement(bottle)), 
 
     ...bottle.filter(getComplement(apple)) 
 
    ]; 
 

 
console.log(unique);

+0

あなたは通常、非常に明確かつ簡潔な答えを書いていますが、経験豊富なES6開発者であっても、ここで矢印関数と1文字の変数名を使用するのはわかりにくく、読みにくいと言います。ちょうどES6が私たちに矢印機能を与えたからといって、コードを1行にまとめるのにそれを使わなければならないわけではありません。 – mhodges

+0

functionキーワードに問題はありますか? – mhodges

+0

@mhodges、いいえ、機能は良いです。あなたはその質問をどういう意味ですか? –

関連する問題