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

Javascript: Convert a list of objects to an associative array

我正在寻找一种方法来获取 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 对附加到新对象很容易,但我想知道是否还有更多简洁的方法。

在 ES6 中:

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

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

或者,

construct a new object and then iterate over each object in the original array and append a new key:value pair to new object

你基本上可以做你刚才说的,但使用 reduce:

以相对简洁的形式
data.reduce((result, {id, name, foo}) => {
  result[id] = {name, foo};
  return result;
}, {})

这是一个使用数组映射的解决方案:

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);

在 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);

你可以试试这个:

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;
}, {});

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

<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));

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

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);

注意,此解决方案将修改原始数组。如果你不想改变原来的,就复制一个。