如何将匹配的属性值映射到同一个对象?

时间:2017-03-30 21:14:15

标签: javascript arrays javascript-objects

我将匹配的对象映射到ID属性值匹配的对象。 到目前为止,reduce和map适用于IDFet属性。

但现在我想将 Name 属性映射到每个新的映射对象。我确实尝试了以下操作,但这会创建一个新的Object,与其他Name值分开。

如何将匹配的属性值映射到对象?

https://jsfiddle.net/brianVarley/zs8xadht/

这是我尝试获取Name映射:

const arr = [{ ID:12, Fet: "Donuts", Name: "DD" } , { ID: 12, Fet: "Cake", Name: "DD" }, { ID: 13, Fet: "Lemon", Name: "CC"}] ;
const grouped = arr.reduce((a,v) => {
    if( !(v.ID in a) ) a[v.ID] = [];
  a.Name = v.Name
  a[v.ID].push(v.Fet);
    return a;
},{});

var newArrayOfReducedObjects = Object.keys(grouped).map(key => {
    return { ID: key, Name: key, Fet: grouped[key] };
});

console.log(newArrayOfReducedObjects);

1 个答案:

答案 0 :(得分:1)

我认为你应该使用泛型group by函数,你可以使用各种键来处理一个对象数组。

var customGroupBy = function(xs, key) {
    return xs.reduce(function(rv, x) {
      (rv[x[key]] = rv[x[key]] || []).push(x);
      return rv;
    }, {});
};

然后您可以为任何键调用此函数:

customGroupBy (arr,"ID")
customGroupBy (arr,"Name")

上面的最后一次调用将导致(JSONified)

"{"DD":[{"ID":12,"Fet":"Donuts","Name":"DD"},{"ID":12,"Fet":"Cake","Name":"DD"}],"CC":[{"ID":13,"Fet":"Lemon","Name":"CC"}]}"