从值中更改具有一个属性的对象的键

Change the key of an object with one attribute from its values

具有具有以下结构的对象数组:

[
    {
        key: id,
        value: id, name, type
    },
    {   key: id,
        value: id, name, type
    },
    {   key: id,
        value: id, name, type
    }
];

使用的密钥是id。同一 id 可以有更多组值,例如:

{ 132: Array(1), 243: Array(1), 389: Array(3)}
    132: Array(1)
        0: eqKey: "abc", id: 132, name: "name1"
    243: Array(1)
        0: eqKey: "ccc", id: 243, name: "name2"
    389: Array(3)
        0: eqKey: "vcv", id: 389, name: "name3"
        1: eqKey: "tre", id: 389, name: "name4"
        2: eqKey: "ace", id: 389, name: "name5"

我的问题是这是否是一种 "regroup" 结构的方法,而不是按 id 分组以按类型分组。 (类型是唯一的)

因此,上述示例的最终形式如下所示:

{"abc": Ar(1), "ccc": Ar(1), "vcv": Ar(1), "tre": Ar(1), "ace": Ar(1)}  
    "abc": Array(1)
        0: eqKey: "abc", id: 132, name: "name1" 
    "ccc": Array(1)
        0: eqKey: "ccc", id: 243, name: "name2"
    "vcv": Array(1)
        0: eqKey: "vcv", id: 389, name: "name3"
    "tre": Array(1)
        0: eqKey: "tre", id: 389, name: "name4"
    "ace": Array(1)
        0: eqKey: "ace", id: 389, name: "name5"

正如评论中所指出的,您的第二个代码片段在 JS 中是不可能的。对象必须具有唯一键。

但是,我相信您要实现的目标是:

const array = [
  {
    1: { id: 1, name: 'name', type: 'ab' }
  },
  {
    5: { id: 5, name: 'name', type: 'aa' },
    4: { id: 4, name: 'name', type: 'ac' }
  }
];

const result = array
  .reduce((arr, item) => Object
    .keys(item)
    .reduce((arr2, key) => ([...arr2, { [item[key].type]: item[key] }]), arr), []);

console.log(result);

您可以使用reduce 来遍历数组。使用 Object.values 将每个对象转换为数组并使用 forEach 循环遍历转换后的数组

const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];

const result = arr.reduce((c, v) => {
  Object.values(v).forEach(o => c.push({[o.type]: o}))
  return c;
}, []);

console.log( result );

在新浏览器(或使用分析器)上,您可以使用 flatMap

const arr = [{"1":{"id":1,"name":"name1","type":"xx"}},{"2":{"id":2,"name":"name2","type":"xy"}},{"5":{"id":5,"name":"name5","type":"vc"},"6":{"id":5,"name":"name6","type":"fg"},"7":{"id":5,"name":"name7","type":"ae"}}];

const result = arr.flatMap(o => Object.values(o).map(v => ({[v.type]: v})))

console.log(result);

您可以使用 reduce method.

来实现您的要求

The reduce() method executes a reducer function (that you provide) on each member of the array resulting in a single output value.

const data = [{
    id: 1,
    name: "name1",
    type: "xx"
  },{
    id: 2,
    name: "name2",
    type: "xy"
  },{
    id: 5,
    name: "name5",
    type: "vc"
  },{
    id: 5,
    name: "name6",
    type: "fg"
  }, {
    id: 5,
    name: "name7",
    type: "ae"
  }
];

const result = data.reduce(function(r, a) {
  r[a.type] = r[a.type] || [];
  r[a.type].push(a);
  return r;
}, Object.create(null));

console.log(result);

您可以对对象的外部值和内部数组使用两个嵌套的 reduce。

var data = { 132: [{ eqKey: "abc", id: 132, name: "name1" }], 243: [{ eqKey: "ccc", id: 243, name: "name2" }], 389: [{ eqKey: "vcv", id: 389, name: "name3" }, { eqKey: "tre", id: 389, name: "name4" }, { eqKey: "ace", id: 389, name: "name5" }] },
    grouped = Object
        .values(data)
        .reduce(
            (r, a) => a.reduce(
                (s, o) => ((r[o.eqKey] = r[o.eqKey] || []).push(o), s),
                r
            ),
            {}
        );

console.log(grouped);