使用JavaScript将数组值添加到映射中?

5

我有一个数组值,其中包含键值对。我想将相同键的数组值映射为以下格式:

Expected Output: [abc: 1],[def:2,42,40]

请看下面的代码:
var a = {"abc": 1, "def": 2, "def": 42, "def" : 40};    
var array_keys = new Array();
var array_values = new Array();
for (var key in a) {
    array_keys.push(key);
    array_values.push(a[key]);
}
alert(array_keys);
alert(array_values);

它返回的值如下:
My output : [abc:def] [1,40]

这个需要帮忙吗?

2
你目前只是将所有的键放入一个数组中,将所有的值放入另一个数组中--实际输出为[abc,def] [1,40] - user887675
这是因为JS期望数组中的每个键都是唯一的。这不会直接起作用。如果您将def更改为3个不同的键,则可以完美地工作。 - paradox
1
var a = {"abc": 1, "def": 2, "def": 42, "def" : 40}; 实际上会产生 **Object {abc: 1, def: 40}**。你最初是如何获取数组值的? - JamesA
2
@Maniram,你不能把结构改为这样吗:{"abc":[1],"def":[2, 42, 40]}? - user2575725
2个回答

6
你可以通过调整初始数据结构来实现类似的效果: 创建一个对象数组:
var a = [{abc: 1}, {def: 2}, {def: 42}, {def: 40}];

设置一个新对象

var o = {};

然后循环遍历数据。对于每个对象:如果在 o,输出对象中该键不存在,则添加该键并将其值设置为数组,否则只需将对象的值推送到数组中。

for (var i = 0, l = a.length; i < l; i++) {
  var key = Object.keys(a[i]);
  if (!o[key]) { o[key] = []; }
  o[key].push(a[i][key]);
}

最终你会得到一个值为数组的对象:

console.log(o); // {abc: [1], def: [2,42,40] }

演示


哦,我希望这个答案能够更新为新的JavaScript Map。 - Aj Otto
1
你可以编写自己的答案 @AjOtto,使用 Map - Andy

1

var a = {"abc": 1, "def": 2, "def": 42, "def" : 40};

这是不可能的。在JavaScript中,对象键必须是唯一的,因此您无法使用相同的键(“def”)添加3个不同的项。如果您定义了多个具有相同键的元素,则至少Chrome将获取最后添加的值。

所以回答您的问题:根据提供的输入,无法得到您期望的输出。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接