簡體   English   中英

arrays 數組中的常用值 - lodash

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM