首页 > 解决方案 > 基于包含数组项的对象属性映射的数组

问题描述

如果我有如下对象

result  = [
 {
   phones : ["ABC", "DEF"],
   name: "Simon"
 },
 {
   phones : ["ABC", "XZY"],
   name: "John"
 }
]

预期产出

键、值映射

{ABC,     ["Simon", "John"]}
{DEF,     ["Simon"]}
{XYZ,     ["John"]}

我的尝试

map: Map = new Map();   
for ( r of result ) {
   for( phone of r.phones) {
      if(map.get(phone)){
        map.put(phone, map.get(phone).concat(r.name))
      } else {
        map.put(phone, r.name);
      }
   }
}

是否有 ES6 方式来执行上述功能?

标签: javascriptnode.js

解决方案


我不知道它是否足够 ES6,但是使用 map-reduce 会给出这样的结果:

result.reduce((map, person) => {
  person.phones.forEach(phone => 
    map.has(phone)
      ? map.get(phone).push(person.name)
      : map.set(phone, [person.name])
  );
  return map;
}, new Map());

但代码或多或少是一样的,性能可能相差不远,可读性在读者眼中。

简而言之,您的里程可能会有所不同。


推荐阅读