2017-06-15 4 views
2

を、配列の配列を渡す:は、私はオブジェクトを含む配列の配列を持っているlodash交差点に

let data = [[{a:0}, {b:1}], [{a:1}, {b:1}]] 

今、私は私が行うと[{b:1}]

を返し、これら2つの配列のlodash intersectionを作りたいと思いますこれは:

import {intersection} from 'lodash' 

return intersection([{a:0}, {b:1}], [{a:1}, {b:1}]) 

結果は正しいです。

しかし、私は

return intersection(data) 

を行うとき、私はちょうど同じ結果を取り戻します。

すべての配列をデータから交差関数に渡す簡単な方法はありますか?私の最初の考えは.mapを使用することでしたが、これは別の配列を返します...

+0

私はあなたが値ではなく参照を比較していると信じているので、これから何かを得ることはできません。代わりに['intersectionBy'](https://lodash.com/docs/4.17.4#intersectionBy)または[' intersectionWith'](https://lodash.com/docs/4.17.4#intersectionWith)を使用する必要があります。 – mhodges

答えて

6

あなたはただspreadの配列です。

intersection(...arrayOfarrays); 

あるいは、事前ES6環境では、applyを使用します。

intersection.apply(null, arrayOfArrays); 

それとも、あなたが広がった引数を持つ関数にintersectを変換することができます:

const intersectionArrayOfArrays = _.spread(_.intersection); 
intersectionArrayOfArrays(arrayOfArrays); 

交差点にはロダッシュdoesn't automatically work on arrays of objectsがあります。

、プロパティb上で交差する場合は、intersectionByを使用することができます。

const arrayOfArrays = [[{a:0}, {b:1}], [{a:1}, {b:1}]]; 
 
console.log(
 
    _.intersectionBy(...arrayOfArrays, 'b') 
 
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

またはintersectionWith、あなたが参照または深い比較して、同じオブジェクト上で交差する場合:

const a1 = {a: 0}; 
 
const a2 = {a: 1}; 
 
const b = {b: 1}; 
 
const arrayOfArrays = [[a1, b], [a2, b]]; 
 

 
// reference comparison 
 
console.log(
 
    _.intersectionWith(...arrayOfArrays, (a, b) => a === b) 
 
) 
 

 
// deep equality comparison 
 
console.log(
 
    _.intersectionWith(...arrayOfArrays, _.isEqual) 
 
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

あなたは配列を広げることができるか分からなかった。ありがとう:) –

+0

@MihaŠušteršičはdrugarを助けてうれしく思います:) – nem035

+0

@ nem035オブジェクト配列交差の正しい使い方を追加していただきありがとうございます。しかし、私はニックピックし、あなたの 'intersectionWith'セクションで' _.isEqual'がオブジェクトを参照によって比較していると言いますが、これは真ではありません。 '_.isEqual'は深いオブジェクトのプロパティ値の比較を行います。 – mhodges

関連する問題