推送元素正在改变json数据中的前一个元素

时间:2016-03-03 08:48:20

标签: javascript angularjs json loops

我有两个json数组。 EXP:

 $scope.arr1 = [
            { "id": 1, "first_name": "Philip", "last_name": "Kim", "email": "pkim0@mediafire.com", "country": "Indonesia", "ip_address": "29.107.35.8" },
            { "id": 2, "first_name": "Judith", "last_name": "Austin", "email": "jaustin1@mapquest.com", "country": "China", "ip_address": "173.65.94.30" },
            { "id": 3, "first_name": "Julie", "last_name": "Wells", "email": "jwells2@illinois.edu", "country": "Finland", "ip_address": "9.100.80.145" },
            { "id": 4, "first_name": "Gloria", "last_name": "Greene", "email": "ggreene3@blogs.com", "country": "Indonesia", "ip_address": "69.115.85.157" },
            { "id": 5, "first_name": "Andrea", "last_name": "Greene", "email": "agreene4@fda.gov", "country": "Russia", "ip_address": "128.72.13.52" }]

$scope.arr2=[];

我希望根据某些条件按字段将arr1的元素按字段推送到arr2。

var object;
var temp = {};

  for (var i in $scope.arr1) {
    object = $scope.arr1[i];
       for (var property in object) {

            temp2 = object.id + '_' + property;
            if ($scope.someOtherData.indexOf("unhighlighted") != -1) {
               temp[property] = "";

              }
             else {

               temp[property] = object[property];

             }
          }
        $scope.arr2.push(temp);
      }

我的第一个问题: 首先将温度推到arr2 OK。但是,当我推动第二个或更多时,arr2中的所有元素都转为最后一个临时值。我可以解决这个问题吗?

我的第二个问题是:我没有将$$ hashKey属性添加到arr1。但它是自发发生的。 我该如何防止这种情况?

3 个答案:

答案 0 :(得分:0)

每次迭代都需要一个新对象,然后你不会通过引用更新同一个对象。

现在你要向array2添加几次相同的对象,它实际上是相同的,所以最后你将在数组2中拥有相同对象的几个副本。

//this help you to prevent usage of the same object
var temp = {};
for (var property in object) {
     //please add here to not copy something that you don't
     if(object.hasOwnProperty(property))
     {         
        ... 
     }   

答案 1 :(得分:0)

你需要在for循环之前声明var temp:

for (var i in $scope.arr1) {
   object = $scope.arr1[i];
   var temp = {};  //<--------here
   for (var property in object) {

答案 2 :(得分:0)

问题是因为在JavaScript中objects are passed around by reference。所以解释你的代码,temp被全局声明为循环,所以创建一个对象并在循环中指定一些值并将temp推送到数组,所有这些都在第一次正常工作,现在你将temp更新为第二个循环中的新值,在这里你要更新same object并且你推入数组的对象也是同一个对象,你只是在循环中处理它的引用直到结束,所以这就是原因您在数组中获得相同的值,并且值是最后一个循环的值。您基本上已经将相同的对象多次推入到数组中,并且更新一个将影响所有对象,因为它们都指向同一个对象。

所以这是修复,

1)正如人们已经建议的那样,在每个循环中创建一个新对象。这样在每个循环中,您创建一个新对象,并且没有参考问题。代码是

   for (var i in $scope.arr1) {
    object = $scope.arr1[i];
    var temp = {};  // creating new object in every loop
    for (var property in object) {
      //your stuff

2)在将对象推入数组之前,先将其复制然后推送,这样就可以一直推送新对象。代码如下所示。

 var newObject = Object.clone(temp); // create a new object by cloning
   $scope.arr2.push(newObject );