【问题标题】:How to group all values that have the same key into an array如何将具有相同键的所有值分组到一个数组中
【发布时间】:2018-08-11 01:14:39
【问题描述】:

首先,如果您发现问题令人困惑,我们深表歉意。 基本上,我有一个这样的对象:

[{"6":6.5},{"4":4.2},{"6":6.3}]

我想要做的是删除重复的键,但保留那里的值并将它们全部推送到一个唯一的键中,作为一个数组。像这样:

[{"6":[6.5, 6.3]}, {"4": 4.2}]

谁能提出解决方案?

【问题讨论】:

  • 为什么要保存为数组,为什么不{"6": [...], "4": [...]}
  • 另外,改变值是数组还是数字并不是一个好主意,保持一致。所以第二个对象应该是{"4": [4.2]}
  • @Barmar:不是重复的。键可以动态变化。
  • 糟糕,这次我错了。
  • 是的,密钥可以动态变化。抱歉,我想要的确切形式是 {"6": [...], "4": [...]}

标签: javascript arrays json


【解决方案1】:

.reduce() 是你想要的:

var data = [{"6":6.5},{"4":4.2},{"6":6.3}];

var res = data.reduce((rv, obj) => {
  var key = Object.keys(obj)[0];
  
  rv[key] = rv[key] || [];
  rv[key].push(obj[key]);
  
  return rv;
}, {});


console.log(res);

注意:这总是以数组格式返回数据(即使只有一个值)。如果您正在寻找您指定的确切格式,您只需要添加更多逻辑,如下所示(尽管我不推荐这种方法,因为它会增加更多的复杂性。)

var data = [{"6":6.5},{"4":4.2},{"6":6.3}];

var res = data.reduce((rv, obj) => {
  var key = Object.keys(obj)[0];
  
  if (Array.isArray(rv[key])) { // Already is an array
    rv[key].push(obj[key]);
  } else if (rv[key] !== undefined) { // Has a value. Convert to array
    rv[key] = [rv[key], obj[key]];
  } else { // Haven't seen this key yet. Set the value
    rv[key] = obj[key];
  }
  
  return rv;
}, {});


console.log(res);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 2011-04-13
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2018-04-30
    相关资源
    最近更新 更多