从数组创建多维对象,将该数组中的值指定为新对象中的键

create multidimensional object from array assigning a value from this array as key in the new object

本文关键字:对象 数组 新对象 创建      更新时间:2023-09-26

我有一个这样的数组(每个数组包含2个以上的键值对,我只使用2个来回答问题)

[{"name":"Joe", "id":17}, {"name":"Bob", "id":17}, {"name":"Carl", "id": 35},{"name":"son", "id": 31},{"name":"smith", "id": 29},{"name":"tom", "id": 35}]

我想设置一个这样的多维对象。对于每个DISTINC"id",并且在该"id"中包含"id"、"name"值。

{
'17' : {
    {"name":"Joe",
    "id":17},
    {"name":"Bob",
    "id":17}
},
'35' : {
    {"name":"Carl", "id": 35},
    {"name":"tom", "id": 35}
},
'31':{"name":"son", "id": 31}
},
 '29':{"name":"smith", "id": 29}
}

正如你所看到的,我想在第一个对象上分配不同的"id"作为密钥

我想我可能会滥用括号,很抱歉,也请纠正我的错误。

我会很懒,使用underscore。它有一个名为groupBy的函数,它可以满足您的需求:

_.groupBy(arr, 'id');

JSFiddle。

对数据进行循环,并将其添加到新对象或附加它,具体取决于它是否已经存在。

var data = [{"name":"Joe", "id":17}, {"name":"Bob", "id":17}, {"name":"Carl", "id": 35},{"name":"son", "id": 31},{"name":"smith", "id": 29},{"name":"tom", "id": 35}];
var new_data = {};
for (var i=0; i<data.length; i++)
{
    if (new_data.hasOwnProperty(data[i].id))
        new_data[data[i].id].push(data[i]);
    else
        new_data[data[i].id] = [data[i]];
}
document.getElementById("new_data").textContent = JSON.stringify(new_data, null, 4);
<pre id="new_data"></pre>

为什么不直接填充一个新对象?

var obj = {};
var arr = [{"name":"Joe", "id":17}, {"name":"Bob", "id":17}, {"name":"Carl", "id": 35},{"name":"son", "id": 31},{"name":"smith", "id": 29},{"name":"tom", "id": 35}];
arr.forEach(function(k) {
   obj[k.id] = k;
})