reducer 仅 returns 最后一个对象

reducer only returns the last object

我有一个这样的对象,

 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',我想将此对象传递给这样的缩减器:

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;
}, {});

那 return 是我这样的对象:

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

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

[

{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"}

]

有人可以帮帮我吗?!

您可以使用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);