Дяд*_*Фея 1 javascript arrays object
我有一个像这样的对象数组:
[
{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
]
Run Code Online (Sandbox Code Playgroud)
我需要进行复杂的修改:
1) 创建一个新的数组,其中有 N 个起始数组的副本,例如 2:
[
{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
]
Run Code Online (Sandbox Code Playgroud)
2)为field字段中的每个对象设置索引
[
{
headerName: 'Make',
field: 'make0',
},
{
headerName: 'Model',
field: 'model0',
},
{
headerName: 'Price',
field: 'price0',
},
{
headerName: 'Make',
field: 'make1',
},
{
headerName: 'Model',
field: 'model1',
},
{
headerName: 'Price',
field: 'price1',
}
]
Run Code Online (Sandbox Code Playgroud)
如何实现这个功能?
附注。我有自己的这个功能选项,但它不能正常工作:
[
{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
]
Run Code Online (Sandbox Code Playgroud)
[
{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
]
Run Code Online (Sandbox Code Playgroud)
这个函数的结果是:
0: "make0"
1: "model0"
2: "price0"
3: "make01"
4: "model01"
5: "price01"
6: "make012"
7: "model012"
8: "price012"
9: "make0123"
10: "model0123"
11: "price0123"
12: "make01234"
13: "model01234"
14: "price01234"
15: "make012345"
16: "model012345"
17: "price012345"
Run Code Online (Sandbox Code Playgroud)
我做错了什么,我该如何解决?
使用 来创建对象的其他副本时Array.from,获取映射器函数中的当前索引,并将其附加到field每个对象的值:
const copies = 3;
const arr = [{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
];
const output = Array.from(
{ length: copies },
(_, i) => arr.map(
({ field, ...rest }) => ({ ...rest, field: field + i })
)
)
.flat()
console.log(output);Run Code Online (Sandbox Code Playgroud)
或者,如果你想坚持你的for循环:
const copies = 3;
const arr = [{
headerName: 'Make',
field: 'make',
},
{
headerName: 'Model',
field: 'model',
},
{
headerName: 'Price',
field: 'price',
},
];
let output = [];
for (let i = 0; i < copies; i++) {
const copy = arr.slice().map(({ field, ...rest }) => ({ ...rest, field: field + i }));
output = [...output, ...copy]
}
console.log(output);Run Code Online (Sandbox Code Playgroud)
你的原始代码的一个问题是,当你这样做时
let copy = columns.slice(0)
...copy.map(item => (item.field = item.field + i))
Run Code Online (Sandbox Code Playgroud)
您不是在复制对象 -.slice仅创建数组的浅表副本,然后在 . 内部.map,您对现有对象进行变异,而不复制它们(然后返回item.field + i表达式的结果,这是不可取的)。
您需要在.map回调中完全复制对象,并返回一个带有更改的新对象field。