概述::有一个product group
对象数组,每个产品组都有items
数组。具有唯一ID但商品数组没有分配任何唯一ID的产品组对象。请在JSON对象下面找到。
const productList = [{
productGroup : 'PG1',
index: 1,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}, {
productGroup : 'PG2',
index: 2,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}];
要求:根据产品组为items
数组的每个项目对象分配一些唯一的ID。
到目前为止,我已经尝试过: working solution : concat index of product group with the index of each list items
const productList = [{
productGroup : 'PG1',
index: 1,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}, {
productGroup : 'PG2',
index: 2,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}];
const itemList = productList.map(obj => {
obj.items.map((itemObj, index) => {
itemObj.productGroup = obj.productGroup;
itemObj.pgIndex = obj.index;
itemObj.itemIndex = obj.index + '' + index;
});
return obj.items;
});
var mergedListItems = itemList.reduce((arr, arrNext) => arr.concat(arrNext));
console.log('mergedListItems', mergedListItems);
这种方法好吗?如果否,那么您能帮我找到最好的方法吗?
答案 0 :(得分:1)
您可以立即.reduce
进入输出数组,而不是多次遍历项目:
const productList = [{
productGroup : 'PG1',
index: 1,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}, {
productGroup : 'PG2',
index: 2,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}];
const mergedListItems = productList.reduce((a, { productGroup, index, items }) => {
items.forEach((itemObj, itemIndex) => {
a.push({
...itemObj,
productGroup,
pgIndex: index,
itemIndex: `${index}${itemIndex}`
});
});
return a;
}, []);
console.log(mergedListItems);
还请注意,您的潜在问题
itemObj.itemIndex = obj.index + '' + index;
逻辑-如果index
大于10怎么办?然后,您可能会看到一个itemIndex
例如为111
的项目。这是什么意思,这意味着原始对象的索引是11,还是项目索引是11?如有可能,请考虑在它们之间使用下划线或分隔符,例如
itemObj.itemIndex = obj.index + '_' + index;
或者,像我的代码一样使用模板文字
itemIndex: `${index}_${itemIndex}`
答案 1 :(得分:1)
您在代码中使用
itemObj.itemIndex = obj.index + '' + index;
在obj.index=12 index=3
和obj.index=1 index=23
之类的情况下,这不是唯一的。但是,如果将''
更改为'-'
,它将是唯一的。
尝试按如下所示id= productGroup.index + '-' + i
(其中i是数组中的项目索引)向每个项目对象添加字段“ id”
productList.forEach(pr=>pr.items.forEach((x,i)=> x.id = pr.index+'-'+i ));
const productList = [{
productGroup : 'PG1',
index: 1,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}, {
productGroup : 'PG2',
index: 2,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}];
productList.forEach(pr=>pr.items.forEach((x,i)=> x.id = pr.index+'-'+i ));
console.log(productList);
您还可以创建独立于productGroup.index的uniqe ID
let i=0;
productList.forEach(pr=>pr.items.forEach(x=> x.id = i++ ));
const productList = [{
productGroup : 'PG1',
index: 1,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}, {
productGroup : 'PG2',
index: 2,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}];
let i=0;
productList.forEach(pr=>pr.items.forEach(x=> x.id = i++ ));
console.log(productList);
答案 2 :(得分:0)
在这里,您有一种使用reduce()和实验性flatMap()的方法。我还将产品名称附加到新的identifier
:
const productList = [{
productGroup : 'PG1',
index: 1,
items: [
{item1: 'item1 value', item2: 'item2 value'},
{item1: 'item1 value', item2: 'item2 value'},
{item1: 'item1 value', item2: 'item2 value'}
]
},
{
productGroup : 'PG2',
index: 2,
items: [
{item1: 'item1 value', item2: 'item2 value'},
{item1: 'item1 value', item2: 'item2 value'}
]
}];
let newList = productList.reduce((res, curr) =>
{
let objs = curr.items.flatMap((x, idx) => Object.assign({
productGroup: curr.productGroup,
pgIndex: curr.index,
itemIndex: [curr.productGroup, curr.index, idx].join("_")
}, x));
return res.concat(objs);
}, []);
console.log(newList);
答案 3 :(得分:0)
我在下面编写的代码将为您完成工作,并且是可视化的足够简单的解决方案。 该解决方案需要使用嵌套的for循环,因为我们还在内部项目数组中循环。我在下面的代码中添加了一些注释,以解释发生了什么。
const productList = [{
productGroup : 'PG1',
index: 1,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}, {
productGroup : 'PG2',
index: 2,
items: [{
item1: 'item1 value',
item2: 'item2 value'
},{
item1: 'item1 value',
item2: 'item2 value'
}]
}];
var count;
for(var char in productList){
count = 1; // Will reset to 1 when we go to a new product group
for(var i = 0; i < productList[char].items.length; i++){
// Adding in the unique key to the items.
productList[char].items[i].uniqueKey = productList[char].productGroup + "_" + count;
count++;
}
}
我希望这对您有帮助:P如果您有任何疑问,请告诉我。