如何从数组和现有对象创建新对象?

时间:2014-03-29 22:04:09

标签: javascript arrays object

我正在尝试使用已存在的对象和数组创建一个具有已修改属性名称的对象。

var ExistingObj = {'123' : 50, '456' : 60, '789' : 90}; 
var idsArr = ['123', '456', '789'];  

我想创建一个包含以下内容的对象数组:

var newArr = [{id : '123', amount: 50}, {id: '345', amount: 60}, {id:'789' : 90}];  

我尝试像这样映射它并没有起作用:

var existingObj = {'123' : 50, '456' : 60, '789' : 90}; 
var idsArr = ['123', '456', '789'];  


function formatArr(idsArr, existingObj){
 var obj = {}; 
 var container = [];

 _.map(idsArr, function(id){
  obj.id = id;  
  obj.amount = existingObj[id];     
  container.push(obj); 
 });
  return container;
}

结果是:

container = [{'id' : '789', 'amount' : 90}, {id : '789', 'amount' : 90}, {id:'789', 'amount' : 90}];  

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您当前的方法会在var obj = {};函数中重用相同的对象(_.map),因为它在_.map调用之外定义。因此,在每个步骤中,您修改相同的对象,然后将其推入container变量。再次。然后再次。再一次。

这就是为什么你会得到一系列相同的记录 - 实际上它们是对同一个对象的引用。

显然,那是错的。但更糟糕的是在push函数中使用_.map: 该函数的主要目的是基于其他一些集合构建一个数组,并且不需要添加自己的代码来实现这一点。这是怎么写的:

function formatArr(idsArr, existingObj) {
  return _.map(idsArr, function(id){
      return {
        id: id,
        amount: existingObj[id]
      });
  });
}

作为旁注,使用_.map而不存储其结果几乎总是一个逻辑错误。如果您不关心迭代结果,请使用_.each

答案 1 :(得分:0)

感谢您的信息!我能够以这种方式工作,因为我在另一个函数中调用它:

function formatArr(idsArr, existingObj, fn){
  var newArr = _.map(idsArr, function(id){
    return {id: id, amount: existingObj[id]}
  });
  fn(newArr);
}