用array of Object更新array中的array对象



我有两个javaScript数组

let x = [
{
id: 'Abc',
children: [
{
id: 12,
name: 'john'
}, {
id: 13,
name: 'dow'
}
]
}, {
id: 'xyz',
children: [
{
id: 123,
name: 'jack'
}, {
id: 134,
name: 'abc'
}
]
}
]
let y = [
{
id: 12,
name: 'mac'
}, {
id: 13,
name: 'dow'
}, {
id: 123,
name: 'Tom'
}, {
id: 134,
name: 'abc'
}
]

我想用y更新我的x,像这样

[
{
id: 'Abc',
children: [
{
id: 12,
name: 'mac'
}, {
id: 13,
name: 'dow'
}
]
}, {
id: 'xyz',
children: [
{
id: 123,
name: 'Tom'
}, {
id: 134,
name: 'abc'
}
]
}
]

我试过这样的解决方案

x.map((a, index)=>{
a.children.map((b, i)=>{
// console.log('update')
y.find(o => o.id === b.id) || b;
})
})

但我有undefined。我找了很多答案,但都没有找到。

x.map((a, index)=>{
a.children.map((b, i)=>{
// console.log('update')
y.find(o => o.id === b.id) || b;
})
})

首先,你犯了一个常见的错误使用数组函数时:括号{}对于单行指令是可选的,但是随后您需要指定return字。

arr.filter(v => v === 2)等价于arr.filter(v => {return v === 2})。忽略return,filter()将返回一个空数组。

单行解决方案:

const res = x.map((a, index) => ({ ...a, children: a.children.map((b, i) => y.find(o => o.id === b.id) || b) }));

代码片段

let x = [
{
id: 'Abc',
children: [
{
id: 12,
name: 'john'
}, {
id: 13,
name: 'dow'
}
]
}, {
id: 'xyz',
children: [
{
id: 123,
name: 'jack'
}, {
id: 134,
name: 'abc'
}
]
}
]
let y = [
{
id: 12,
name: 'mac'
}, {
id: 13,
name: 'dow'
}, {
id: 123,
name: 'Tom'
}, {
id: 134,
name: 'abc'
}
]
const res = x.map((a, index) => 
({ ...a, children: a.children.map((b, i) => y.find(o => o.id === b.id) || b) }));
console.log(res);

首先为y创建loop对象,然后为x使用map作为子对象

let x = [
{
id: "Abc",
children: [
{
id: 12,
name: "john",
},
{
id: 13,
name: "dow",
},
],
},
{
id: "xyz",
children: [
{
id: 123,
name: "jack",
},
{
id: 134,
name: "abc",
},
],
},
];
let y = [
{
id: 12,
name: "mac",
},
{
id: 13,
name: "dow",
},
{
id: 123,
name: "Tom",
},
{
id: 134,
name: "abc",
},
];
const lookupY = {};
y.forEach(({ id, name }) => (lookupY[id] = name));
const newX = x.map(({ id, children }) => ({
id,
children: children.map((item) => ({ id:item.id, name: lookupY[item.id] })),
}));
console.log(newX)

首先,您忘记在回调函数中返回结果。那么你不应该丢失其他对象的密钥。

const x = [
{
id: 'Abc',
children: [
{
id: 12,
name: 'john'
}, {
id: 13,
name: 'dow'
}
]
}, {
id: 'xyz',
children: [
{
id: 123,
name: 'jack'
}, {
id: 134,
name: 'abc'
}
]
}
];
const y = [
{
id: 12,
name: 'mac'
}, {
id: 13,
name: 'dow'
}, {
id: 123,
name: 'Tom'
}, {
id: 134,
name: 'abc'
}
];
const newArr = x.map((a, index) => {
const children = a.children.map((b, i) => {
return y.find(o => o.id === b.id) || b;
})
return { ...a, children };
})
console.log(newArr);

最新更新