карта рефактора, уменьшить и удвоить для l oop - javascript es6 - PullRequest
0 голосов
/ 23 января 2020

У меня есть JavaScript объект, скажем, parentObj.

Как я могу улучшить приведенный ниже код. У меня есть reduce, map и double for loop.

[
   {
      NAME: 'SOMENAME',
      ID: '1',
      FROM: '20191223',
      TO: '99991231'
    },

   {
      NAME: 'SOMENAME',
      ID: '2',
      FROM: '20191223',
      TO: '99991231'
   },

   {
      NAME: 'SOMENAME',
      ID: '3',
      FROM: '20191223',
      TO: '99991231'
   }
]

Я создал новый объект.

  const newObj = .reduce(
    function (obj, item) {
      obj[item.NAME] = obj[item.NAME] || [];
      obj[item.NAME].push(item.ID);
      return obj;
    },
    {}
  );

Затем новый массив объектов из этого.

  const newObjArr = Object.keys(newObj ).map(function (key) {
        return { NAME: key, ID: newObj [key] };
      });

А затем удвоить для l oop.

      for (let item1 of newObjArr) {
        for (let item2 of parentObj) {
          if (item1.NAME=== item2.NAME) {
            finalObjArr.push({ NAME: item1.NAME, ID: item1.ID, FROM: item2.FROM, TO: item2.TO});
          }
        }
      }

Мой окончательный вывод:

[
   {
      NAME: 'SOMENAME',
      ID: [1, 2, 3],
      FROM: '20191223',
      TO: '99991231'
   },
   ...
]

Ответы [ 3 ]

1 голос
/ 23 января 2020

Вы можете использовать следующее:

// sample data
let parentObj = [{NAME: 'SOMENAME',ID: '1',FROM: '20171223',TO: '99991231'},{NAME: 'SOMENAME',ID: '2',FROM: '20181223',TO: '99991231'},{NAME: 'SOMENAME',ID: '3',FROM: '20191223',TO: '99991231'}];

let map = new Map(parentObj.map(o => [o.NAME, []]));
parentObj.forEach(o => map.get(o.NAME).push(o));
let finalObjArr = Array.from(map.values(), arr => 
     arr.map(o => ({...o, ID: arr.map(o => o.ID)}))
).flat();

console.log(finalObjArr);

Разница с вашим собственным решением в том, что каждый массив ID в выводе теперь будет независимым. Так что, если вы измените его, это изменение не будет отображаться в другом объекте.

Я использовал array.flat(), которого нет в ES6 (вы упомянули ES6). Если это проблема, используйте вместо нее [].concat(...array).

1 голос
/ 23 января 2020

У вас уже есть тот newObj, где вы можете искать вещи по имени. Не нужно строить это newObjArr и l oop поверх него для поиска по имени. Просто напишите

for (const item2 of parentObj) {
  const item1_NAME = item2.NAME;
  const item1_IDs = newObj[item1_NAME];
  finalObjArr.push({ NAME: item1_NAME, ID: item1_IDs, FROM: item2.FROM, TO: item2.TO});
}

Учитывая ваши обновления в комментариях, я бы посоветовал вам фактически поместить ваши объекты со всей информацией в newObj, тогда все, что вам нужно получить, это его значения в виде массив:

const newObj = parentObj.reduce((obj, item) => {
  if (!(item.NAME in obj))
    obj[item.NAME] = { NAME: item.NAME, ID: [], FROM: item.FROM, TO: item.TO };
  obj[item.NAME].ID.push(item.ID);
  return obj;
}, {});
const finalObjArr = Object.values(newObj);
0 голосов
/ 23 января 2020

Это может быть то, что вы хотите.

const parentObj = [{
    NAME: 'SOMENAME',
    ID: '1',
    FROM: '20191223',
    TO: '99991231'
},
{
    NAME: 'SOMENAME',
    ID: '2',
    FROM: '20191223',
    TO: '99991231'
},
{
    NAME: 'SOMENAME',
    ID: '3',
    FROM: '20191223',
    TO: '99991231'
}]

const ids = parentObj.reduce((p,{NAME, ID})=>
        ((p[NAME] || (p[NAME] = [])),
         (p[NAME].push(ID)), p), {})

console.log(parentObj.map(({NAME, FROM, TO})=>
        ({NAME, ID: ids[NAME], FROM, TO})))

Или это может быть то, что вы хотите. Была возможность двусмысленности на основе вашего комментария к другому ответу:

const parentObj = [{
    NAME: 'SOMENAME',
    ID: '1',
    FROM: '20191223',
    TO: '99991231'
},
{
    NAME: 'SOMENAME',
    ID: '2',
    FROM: '20191223',
    TO: '99991231'
},
{
    NAME: 'SOMENAME',
    ID: '3',
    FROM: '20191223',
    TO: '99991231'
}]

console.log(Object.values(parentObj.reduce(
    (p,{NAME, ID, FROM, TO})=>
        ((p[NAME] || (p[NAME] = {NAME, ID: [], FROM, TO})),
         (p[NAME]['ID'].push(ID)), p), {})))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...