为每个对象创建唯一的ID

时间:2019-01-21 05:28:08

标签: javascript arrays json ecmascript-6 javascript-objects

概述::有一个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);

这种方法好吗?如果否,那么您能帮我找到最好的方法吗?

4 个答案:

答案 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=3obj.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如果您有任何疑问,请告诉我。