Javascript:将对象列表转换为关联数组

时间:2016-03-30 04:23:13

标签: javascript arrays javascript-objects

我正在寻找一种获取JavaScript对象数组的方法,并获取由某些属性键入的那些对象的关联数组。

例如,给定这个对象数组:

var data = [
  {'id': 100, name: 'bob', foo: 'bar'},
  {'id': 200, name: 'john', foo: 'qux'}
];

我希望能够通过id查找每个对象,所以我想要一个像这样的对象:

var new_data = {
  100: {name: 'bob', foo: 'bar'}, 
  200: {name: 'john', foo: 'qux'}
}

// now I can use new_data[200] to access `john`

虽然我确信构造一个新对象然后迭代原始数组中的每个对象并将一个新的key:value对附加到新对象上很简单,我想知道是否有更简洁的方法它。

6 个答案:

答案 0 :(得分:6)

在ES6中:

Object.assign({}, ...data.map(({id, name, foo}) => ({[id]: {name, foo}})))

这会将输入中的每个对象映射到一个id为key的单属性对象,然后将这些对象传播到Object.assign的参数中,这些参数会将它们粘合在一起。

或者,

  

构造一个新对象,然后迭代原始数组中的每个对象,并将一个新的key:value对追加到新对象

您可以使用reduce

以相对简洁的形式完成您刚才所说的内容
data.reduce((result, {id, name, foo}) => {
  result[id] = {name, foo};
  return result;
}, {})

答案 1 :(得分:1)

你可以试试这个:

var data = [
   {'id': 100, name: 'bob', foo: 'bar'},
   {'id': 200, name: 'john', foo: 'qux'}
];

data.reduce(function(p, c){
  p[c.id] = {name:c.name, foo: c.foo};
  return p;
}, {});

答案 2 :(得分:0)

以下是使用数组映射的解决方案:

var data = [{
  'id': 100,
  name: 'bob',
  foo: 'bar'
}, {
  'id': 200,
  name: 'john',
  foo: 'qux'
}];

var new_data = {};
// Iterate over data
data.map(obj => {
  // Create new object from old
  new_data[obj.id] = {
    'name': obj.name,
    'foo': obj.foo
  }

});


console.log(new_data);

答案 3 :(得分:0)

在ES5中: 工作JSBIN:https://jsbin.com/qudeze/edit?js,console

var data = [
  {'id': 100, name: 'bob', foo: 'bar'},
  {'id': 200, name: 'john', foo: 'qux'}
];


var new_data = {
  100: {name: 'bob', foo: 'bar'}, 
  200: {name: 'john', foo: 'qux'}
};

var y = data.reduce(function(result, next) {
  result[next.id] = {name: next.name, foo: next.foo};
  return result;
}, {});


console.log(y);

答案 4 :(得分:0)

你的代码应该是这样的....

<script type="text/javascript">
    var data = [
          {'id': 100, name: 'bob', foo: 'bar'},
          {'id': 200, name: 'john', foo: 'qux'}
        ];

    var new_data = {};
    for(var i=0; i<data.length; i++){
        var element = {};
        element["name"] = data[i].name;
        element["foo"] = data[i].foo;
        new_data[data[i].id] = element;             
    }
console.log(JSON.stringify(new_data));

答案 5 :(得分:0)

我认为我们不能使用map方法。因为我们的输出不是数组而是对象。我们可以使用每种方法来帮助我们。以下是示例代码:

var data = [
    {'id': 100, name: 'bob', foo: 'bar'},
    {'id': 200, name: 'john', foo: 'qux'}
];

var result = {};

data.forEach(function(item){
   var key = item.id;

   //remove id from item
   delete item.id;

   result[key] = item;
});

console.log(result);

注意,此解决方案将修改原始数组。如果您不想更改原始版本,只需复制一个。