合并数组 js

Merging arrays js

提问人:Ashgreninja55 提问时间:11/16/2023 最后编辑:Nick VuAshgreninja55 更新时间:11/16/2023 访问量:60

问:

我有一个数据数组:

[
   { name: '1', goalsTable: 6544b8a5fea0bf50fc0c62fb },
   { name: '1fork', goalsTable: 6548740f05dc440b5c61c5ac }
]

我有一个goalsData数组:

[
   {
     _id: 6544b8a5fea0bf50fc0c62fb,
     tableData: [ [Object], [Object], [Object], [Object] ],
     goalsData: { qty: 12 }
   },
   {
     _id: 6548740f05dc440b5c61c5ac,
     tableData: [ [Object], [Object], [Object], [Object], [Object] ],
     goalsData: { qty: 10 }
   }
 ]

我想要的是合并对象,如果 id 彼此匹配。例如,如果 goalsData 的第一个对象的_id与 goalsTable 的数据匹配,则数据对象变为:

[{
   name: '1', 
   goalsTable: 6544b8a5fea0bf50fc0c62fb, 
   tableData: [ [Object], [Object], [Object], [Object] ], 
   goalsData: { qty: 12 } 
}]
数组 javascript 对象

评论

1赞 Nick Vu 11/16/2023
假设如果“1fork”项目不匹配,“1fork”项目会在那里吗?

答:

0赞 Carsten Massmann 11/16/2023 #1

如果将第二个数组转换为查找对象,则可以轻松实现该目标:

const arr = [{name:"1", goalsTable: "6544b8a5fea0bf50fc0c62fb"}, { name: "1fork", goalsTable: "6548740f05dc440b5c61c5ac" } ],
 goalsData = [ { "_id": "6544b8a5fea0bf50fc0c62fb", tableData: [ "o1","o2","o3","o4" ], goalsData: { qty: 12 } }, { _id: "6548740f05dc440b5c61c5ac", tableData: [ "o5", "o6", "o7", "o8" ], goalsData: { qty: 10 } } ];

// prepare the lookup object:
const goals=goalsData.reduce((a,c)=>{
 a[c._id]={...c};
 delete a[c._id]._id;
 return a; 
},{});

// Combine the two:

const res= arr.map(c=>({...c, ...(goals[c.goalsTable]??{})}));

console.log(res);

使用查找对象需要更多内存,但它会加快匹配过程。这对于大型阵列来说更为重要。

0赞 MSeilly 11/16/2023 #2

如果我理解正确,您正在尝试将一个数组的_id与另一个数组的 goalstable 键相匹配。为此,您可能希望遍历这两个数组。我使用 .map 函数以嵌套形式遍历两个数组,并使用 if 语句检查后一个值是否匹配,如果匹配,我将这些值添加到初始数组中。

arr.map((value, index) => {
  arr2.map((value2, index2) => {
    if (value.goalsTable == value2._id) {
      arr[index]["_id"] = value2._id;
      arr[index]["tableData"] = value2.tableData;
      arr[index]["goalsData"] = value2.goalsData;
    }
  });
});

在以下代码片段中测试了结果,它们工作正常。

let arr = [{
    name: "1",
    goalsTable: "6544b8a5fea0bf50fc0c62fb"
  },
  {
    name: "1fork",
    goalsTable: "6548740f05dc440b5c61c5ac"
  },
];

let arr2 = [{
    _id: "6544b8a5fea0bf50fc0c62fb",
    tableData: [
      [Object],
      [Object],
      [Object],
      [Object]
    ],
    goalsData: {
      qty: 12
    },
  },
  {
    _id: "6548740f05dc440b5c61c5ac",
    tableData: [
      [Object],
      [Object],
      [Object],
      [Object],
      [Object]
    ],
    goalsData: {
      qty: 10
    },
  },
];

arr.map((value, index) => {
  arr2.map((value2, index2) => {
    if (value.goalsTable == value2._id) {
      arr[index]["_id"] = value2._id;
      arr[index]["tableData"] = value2.tableData;
      arr[index]["goalsData"] = value2.goalsData;
    }
  });
});

console.log(arr);

0赞 thelonglqd 11/16/2023 #3

我们可以像这样处理您的案件。您可以自己实现,但我认为它更方便,因为大多数 JS 项目都会使用 .lodashomitlodash

import { omit } from 'lodash';

const a = [
  { name: '1', goalsTable: '6544b8a5fea0bf50fc0c62fb' },
  { name: '1fork', goalsTable: '6548740f05dc440b5c61c5ac' },
];

const b = [
  {
    _id: '6544b8a5fea0bf50fc0c62fb',
    tableData: [[Object], [Object], [Object], [Object]],
    goalsData: { qty: 12 },
  },
  {
    _id: '6548740f05dc440b5c61c5ac',
    tableData: [[Object], [Object], [Object], [Object], [Object]],
    goalsData: { qty: 10 },
  },
];

const result = a.map((item) => {
  const bTmp = b.find((bItem) => bItem._id === item.goalsTable);

  return {
    ...item,
    ...omit(bTmp, '_id'),
  };
});

console.log('result :', result);