reducer只返回最后一个对象

时间:2018-03-24 02:54:58

标签: javascript object reducers

我有一个像这样的对象,

 var myObj = {
        'id001':{ a:'a', b:'b', c:'c', d:'d', e:'e', f:'f', g:'g', h:'h', i:'i'},
        'id002':{ a:'a', b:'b', c:'c', d:'d', e:'e', f:'f', g:'g', h:'h', i:'i'},
        'id003':{ a:'a', b:'b', c:'c', d:'d', e:'e', f:'f', g:'g', h:'h', i:'i'},
        'j':'j'
    };

该对象可能包含许多键,如:'id001', 'id002', 'id003','id004', ...等,它只有一个键'j',我想将此对象传递给这样的reducer:

var newObj = Object.keys(myObj).reduce((c, v) => {
    if (typeof myObj[v] === 'object') c = Object.assign(c, { id: v }, myObj[v]);
    else c[v] = myObj[v];
    return c;
}, {});

给我一​​个像这样的对象:

{id: "id001", a: "a", b: "b", c: "c", d: "d", e:"e", f:"f", g:"g", h:"h", i:"i", j:"j"}

问题是这个reducer只返回最后一个对象,我希望它返回一个这样的对象:

[

{id: "id001", a: "a", b: "b", c: "c", d: "d", e:"e", f:"f", g:"g", h:"h", i:"i", j:"j"},
{id: "id002", a: "a", b: "b", c: "c", d: "d", e:"e", f:"f", g:"g", h:"h", i:"i", j:"j"},
{id: "id003", a: "a", b: "b", c: "c", d: "d", e:"e", f:"f", g:"g", h:"h", i:"i", j:"j"}

]
有人可以帮助我吗?!

1 个答案:

答案 0 :(得分:0)

您可以使用array#reduce创建一个数组,并使用其键包含字符串id的键推送所有对象。然后遍历生成的数组并添加所有没有id密钥的密钥。

var myObj = { 'id001':{ a:'a', b:'b', c:'c', d:'d', e:'e', f:'f', g:'g', h:'h', i:'i'}, 'id002':{ a:'a', b:'b', c:'c', d:'d', e:'e', f:'f', g:'g', h:'h', i:'i'}, 'id003':{ a:'a', b:'b', c:'c', d:'d', e:'e', f:'f', g:'g', h:'h', i:'i'}, 'j':'j' },
    result = Object.keys(myObj).reduce((r,id) =>{
      if(id.includes('id')){
        r.push({id, ...myObj[id]});
      }
      return r;
    },[]);
Object.keys(myObj).forEach(k => {
  if(!k.includes('id')){
    result.forEach(o => o[k] = k);
  }
});
console.log(result);