[英]Common values in array of arrays - lodash
我有一個看起來像這樣的數組:
const myArray = [
[
{id: 1, name: 'Liam'},
{id: 2, name: 'Oliver'},
{id: 3, name: 'Jake'},
],
[
{id: 1, name: 'Liam'},
{id: 2, name: 'Oliver'},
{id: 4, name: 'Joe'},
],
]
我需要通過 id 找到公共元素,並將它們返回到一個看起來像這樣的數組中:
[
{id: 1, name: 'Liam'},
{id: 2, name: 'Oliver'},
]
如果沒有任何方法可以使用 lodash,那么 JS 也可以。 請注意,我不知道里面有多少個 arrays,所以它應該適用於任何數量。
您可以使用 lodash 的_.intersectionBy()
。 您需要傳播myArray
,因為_intersectionBy()
期望 arrays 為 arguments,而不是單個數組數組:
const myArray = [[{"id":1,"name":"Liam"},{"id":2,"name":"Oliver"},{"id":3,"name":"Jake"}],[{"id":1,"name":"Liam"},{"id":2,"name":"Oliver"},{"id":4,"name":"Joe"}]] const result = _.intersectionBy(...myArray, 'id') console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>
一個 vanilla 解決方案可以像在數組的第一個元素上調用filter()
一樣簡單,檢查every()
后續元素是否包含匹配的some()
元素。
const [srcElement, ...compArray] = [...myArray]; const intersection = srcElement.filter(o => ( compArray.every(arr => arr.some(p => p.id === o.id))) ); console.log(intersection)
.as-console-wrapper { max-height: 100%;important: top; 0; }
<script> const myArray = [ [{ id: 1, name: 'Liam' }, { id: 2, name: 'Oliver' }, { id: 3, name: 'Jake' }], [{ id: 1, name: 'Liam' }, { id: 2, name: 'Oliver' }, { id: 4, name: 'Joe' }], [{ id: 1, name: 'Liam' }, { id: 2, name: 'Oliver' }, { id: 5, name: 'Dean' }, { id: 6, name: 'Mara' }] ] </script>
如今,即使沒有實用程序庫的幫助,vanilla ES 也可以以功能方式與 collections 一起使用非常強大。 您可以使用常規Array
的方法來獲得純 JS 解決方案。 我用純 JS 創建了兩個示例。 當然,也可以有更多的方法。 如果你已經在你的應用程序中使用了 Lodash,那么最好只使用上面提出的_.intersectionBy()
形式的高級實現來降低代碼復雜性。
const myArray = [
[
{id: 1, name: 'Liam'},
{id: 2, name: 'Oliver'},
{id: 3, name: 'Jake'},
],
[
{id: 1, name: 'Liam'},
{id: 2, name: 'Oliver'},
{id: 4, name: 'Joe'},
],
];
// Regular functional filter-reduce
const reducer = (accum, x) => {
return accum.findIndex(y => x.id == y.id) < 0
? [...accum, x]
: accum;
};
const resultFilterReduce = myArray
.flat()
.filter(x => myArray.every(y => y.findIndex(obj => obj.id === x.id) > -1))
.reduce(reducer, []);
console.log(resultFilterReduce);
// Filter-reduce with using of "HashMap" to remove duplicates
const resultWithHashMap = Object.values(
myArray
.flat()
.filter(x => myArray.every(y => y.findIndex(obj => obj.id === x.id) > -1))
.reduce((accum, x) => {
accum[x.id] = x;
return accum;
}, {})
);
console.log(resultWithHashMap);
使用嵌套的forEach
循環和Set
。 Go 遍歷每個子陣列,找出迄今為止的共同項目。
const intersection = ([firstArr, ...restArr]) => { let common = new Set(firstArr.map(({ id }) => id)); restArr.forEach((arr) => { const newCommon = new Set(); arr.forEach(({ id }) => common.has(id) && newCommon.add(id)); common = newCommon; }); return firstArr.filter(({ id }) => common.has(id)); }; const myArray = [ [ { id: 1, name: "Liam" }, { id: 2, name: "Oliver" }, { id: 3, name: "Jake" }, ], [ { id: 1, name: "Liam" }, { id: 2, name: "Oliver" }, { id: 4, name: "Joe" }, ], [ { id: 2, name: "Oliver" }, { id: 4, name: "Joe" }, ], ]; console.log(intersection(myArray));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.