создание уникального идентификатора для каждого объекта - PullRequest
0 голосов
/ 21 января 2019

Обзор: Существует массив объекта product group, и каждая группа продуктов имеет массив items.Объект группы продуктов имеет уникальный идентификатор, но массиву элементов не назначен уникальный идентификатор.Ниже приведен объект 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 на основе группы продуктов.

Я пробовал до сих пор: рабочее решение: общий индекс группы продуктов с индексом каждого элемента списка

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 голосов
/ 21 января 2019

Код, который я написал ниже, сделает работу за вас и является достаточно простым решением для визуализации. Решение потребовало использования вложенных циклов 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 Дайте мне знать, если у вас есть какие-либо вопросы.

0 голосов
/ 21 января 2019

В вашем коде вы используете

itemObj.itemIndex = obj.index + '' + index;

Что может быть не уникальным для таких случаев, как obj.index=12 index=3 и obj.index=1 index=23. Но если вы измените значение '' на '-', оно будет уникальным.

Попробуйте добавить поле 'id' к каждому объекту items следующим образом id= productGroup.index + '-' + i (где i - индекс элемента в массиве)

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

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);
0 голосов
/ 21 января 2019

Здесь у вас есть один подход, использующий lower () и экспериментальный 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);
0 голосов
/ 21 января 2019

Вы можете .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}`
...