在javascript中的唯一键上的Club JSON对象

时间:2016-08-25 06:33:15

标签: javascript json

我正在尝试通过使用相同的ID来粘贴多个对象来创建更整洁的JSON对象。 这是我尝试过的:  1.存储第一个对象的ID以匹配后续ID。  2.迭代数组并检查类似的ID,如果返回匹配项,则将名称作为另一个数组中的对象推送,否则将推入具有存储名称作为属性的新对象。  3.空名。

有很多条件可以检查对象是否是数组的最后一个元素。我只是在寻找一种实现这一目标的优化方法。考虑到问题的具体性质,我无法在SO中找到确切的类似问题。

我有一个JSON对象,如:

[
{
    id: 1,
    name: 'John'
},
{
    id: 1,
    name: 'Jack'
},
{
    id: 2,
    name: 'Drake'
},
{
    id: 2,
    name: 'Joey'
},
{
    id: 3,
    name: 'Justin'
},
{
    id: 3,
    name: 'Rob'
}
]

我想把具有类似ID的对象聚集在一起,有点像这样:

[{
    id: 1,
    names: [{
        name: 'John'
    },
    {
        name: 'Jack'
    }]
},
{
    id: 2,
    names: [{
        name: 'Drake'
    },
    {
        name: 'Joey'
    }]
},
{
    id: 3,
    names: [{
        name: 'Justin'
    },
    {
        name: 'Rob'
    }]
}]

2 个答案:

答案 0 :(得分:2)

您可以使用Array#forEach和哈希的对象。



var data = [{ id: 1, name: 'John' }, { id: 1, name: 'Jack' }, { id: 2, name: 'Drake' }, { id: 2, name: 'Joey' }, { id: 3, name: 'Justin' }, { id: 3, name: 'Rob' }],
    grouped = [];

data.forEach(function (a) {
    if (!this[a.id]) {
        this[a.id] = { id: a.id, names: [] };
        grouped.push(this[a.id]);
    }
    this[a.id].names.push({ name: a.name });
}, Object.create(null));

console.log(grouped);




答案 1 :(得分:1)

Array#reduce 方法与索引引用对象一起使用。

var data = [{  id: 1,  name: 'John'}, {  id: 1,  name: 'Jack'}, {  id: 2,  name: 'Drake'}, {  id: 2,  name: 'Joey'}, {  id: 3,  name: 'Justin'}, {  id: 3,  name: 'Rob'}];

// object for index reference
var ind = {};

// iteraate over array
var res = data.reduce(function(arr, obj) {
  // check index defined already
  if (ind.hasOwnProperty(obj.id)) {
    // if defined then push the name value
    arr[ind[obj.id]].names.push({name: obj.name});
  } else {
    // else push a new object in prefered format
    arr.push({ id: obj.id, names: [{ name: obj.name }] });
    // define the index in reference object
    ind[obj.id] = arr.length - 1;
  }
  // return the updated array
  return arr;
  // set initial value as epty array
}, []);

console.log(res);