提问人:Ashgreninja55 提问时间:11/16/2023 最后编辑:Nick VuAshgreninja55 更新时间:11/16/2023 访问量:60
合并数组 js
Merging arrays js
问:
我有一个数据数组:
[
{ 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 }
}]
答:
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 项目都会使用 .lodash
omit
lodash
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);
评论