dojo array.push替换了上一个项目

时间:2016-07-20 20:35:36

标签: javascript arrays dojo push

以下javascript将personNames作为

返回

[{"name":"smith"},{"name":"smith"},{"name":"smith"}]

而不是

[{"name":"john"},{"name":"doug"},{"name":"smith"}]

var personNames = []; 
var personName = {}; 

var persons = [{"firstname": "john", "id": "111"}, {"firstname": "doug", "id": "777"}, {"firstname": "smith", "id": "888"}];

if(persons.length > 0){
  array.forEach(persons, function(person){
  personName.name = person.firstname;
  personNames.push(personName);
  });
}

5 个答案:

答案 0 :(得分:1)

首先,作为一种获取名称的方法,您可以使用Array.prototype.map



var persons = [{"firstname": "john", "id": "111"}, {"firstname": "doug", "id": "777"}, {"firstname": "smith", "id": "888"}];

var personNames = persons.map(p => ({ name: p.firstname }));

console.log(personNames);




然后你的代码的问题是你创建了一个对象,每次你改变它的值,然后再次将同一个对象推送到数组。

我认为你忘了关于对象和引用的一些事情。顺便说一句,这将是你的正确实施:



var persons = [{"firstname": "john", "id": "111"}, {"firstname": "doug", "id": "777"}, {"firstname": "smith", "id": "888"}];

var personNames = [];

persons.forEach(p => personNames.push({ name: p.firstname }));

console.log(personNames);




另一件需要提及的事情是,无需检查人物中是否有任何物品。

答案 1 :(得分:0)

  array.forEach(persons, function(person){
  personName.name = person.firstname;
  personNames.push(personName);
  });

personName在每次迭代中引用相同的对象。 JavaScript在内存中保留对该对象的引用,因此当您稍后更新它时,它会随处更新,包括在数组内部。

对于您的用例,您需要每次重新初始化personName

  array.forEach(persons, function(person){
  personName = {};
  personName.name = person.firstname;
  personNames.push(personName);
  });

(第一行应该是persons.forEach(function(person){吗?)

答案 2 :(得分:0)

只需使用personName localy:

var personNames = [];

var persons = [{"firstname": "john", "id": "111"}, {"firstname": "doug", "id": "777"}, {"firstname": "smith", "id": "888"}];

if(persons.length > 0) {
    persons.forEach(element => {
      var personName = {};
      personName.name = element.firstname;
      personNames.push(personName);
    });
}
console.log(personNames); // [ { name: 'john' }, { name: 'doug' }, { name: 'smith' } ]

答案 3 :(得分:0)

  • $array.forEach()不是函数,因为未定义array。 使用数组的名称,即persons.forEach()
  • 在本地使用personName,否则您将访问将返回上次更新值的变量的全局实例。 Check code snippet at JS Bin

   

 var personNames = []; 

var persons = [{"firstname": "john", "id": "111"}, {"firstname": "doug", "id": "777"}, {"firstname": "smith", "id": "888"}];

if(persons.length > 0){
  persons.forEach(function(person){
    //use personName locally
    var personName = {};
    personName.name = person.firstname;

    personNames.push(personName);
  });
}

console.log(personNames);

答案 4 :(得分:-1)

试试

var personNames = []; 

var persons = [{"firstname": "john", "id": "111"}, {"firstname": "doug", "id": "777"}, {"firstname": "smith", "id": "888"}];
for (i = 0; i < persons.length; i++) {
   personNames.push({name:persons[i].firstname});
}