首页 > 解决方案 > 重构 map、reduce 和 double for 循环 - javascript es6

问题描述

我有一个 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] };
      });

然后是一个双 for 循环。

      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'
   },
   ...
]

标签: javascriptecmascript-6

解决方案


您已经拥有newObj可以按名称查找内容的地方。无需构建它newObjArr并循环它以按名称搜索。写吧

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);

推荐阅读