【问题标题】:Change the key of an object with one attribute from its values从其值更改具有一个属性的对象的键
【发布时间】:2018-11-27 18:19:27
【问题描述】:

拥有一个具有这种结构的对象数组:

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

我的问题是它是否是一种“重新组合”结构的方法,而不是按 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"

【问题讨论】:

标签: javascript arrays object grouping key-value


【解决方案1】:

您可以对对象的外部值和内部数组使用两个嵌套的 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以使用reduce method 来满足您的要求。

      reduce() 方法在 数组的每个成员都会产生一个输出值。

      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);
      

      【讨论】:

        【解决方案4】:

        正如 cmets 中所指出的,您的第二个代码 sn-p 在 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);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-06
          • 2017-07-24
          • 2021-11-23
          • 1970-01-01
          • 2018-12-26
          • 2018-12-03
          相关资源
          最近更新 更多