俱乐部JSON对象的唯一键在javascript中

Club JSON Object on unique key in javascript

本文关键字:javascript 一键 唯一 JSON 对象 俱乐部      更新时间:2023-09-26

我试图创建一个整洁的JSON对象通过俱乐部多个对象具有相同的id。以下是我尝试过的方法:1. 存储第一个对象的ID以匹配后续的ID。2. 遍历数组并检查是否有类似的id, If返回匹配,将名称作为对象推入另一个数组,否则推入一个新对象,并将存储的名称作为属性。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'
    }]
}]

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

在索引引用对象上使用 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);