angularJS更新第二个数组值的数组

时间:2016-01-01 11:07:51

标签: javascript

我使用angularJS,并且有2个数组如下

$scope.varStr = [{"subjectId":"1","subjectShortName":"English"},
             {"subjectId":"2","subjectShortName":"French"},
             {"subjectId":"3","subjectShortName":"German"},
             {"subjectId":"4","subjectShortName":"Latin"},
             {"subjectId":"5","subjectShortName":"English-Aus"}
             ];

$scope.varStr2 = [{"subjectId":"1","subjectShortName":"English"},
             {"subjectId":"5","subjectShortName":"English-Aus"}
             ];

使用新的KEY " IsSelected":true / false ,在$ scope.varStr2,UPDATE $ scope.varStr中创建新的$ scope.varStr3的类似值的基础

$scope.varStr3 = [{"subjectId":"1","subjectShortName":"English","IsSelected": true},
             {"subjectId":"2","subjectShortName":"French","IsSelected": false},
             {"subjectId":"3","subjectShortName":"German","IsSelected": false},
             {"subjectId":"4","subjectShortName":"Latin","IsSelected": false},
             {"subjectId":"5","subjectShortName":"English-Aus","IsSelected": true}
             ];              

for (var index = 0; index < varStr.length; index++) {
                if (varStr[index].subjectId == varStr2[index].subjectId) {
                    varStr.push("'IsSelected':'true'");
                }
            }

2 个答案:

答案 0 :(得分:2)

您的代码中存在许多问题,并且都是非常基本的问题,因此我建议您修改算法和JavaScript的基础知识。我会尝试尽我所能地解释,但这不能取代读一本好书和练习。

让我们检查你的代码:

for (var index = 0; index < varStr.length; index++) {
    if (varStr[index].subjectId == varStr2[index].subjectId) {
        varStr.push("'IsSelected':'true'");
    }
}

这里有三个重要问题:

  1. 您假设varStrvarStr2中的匹配对象位于同一索引处。但事实并非如此。例如,subjectId=5的对象在第一个数组中位于索引4处,而在第二个数组中位于索引1处。这是不正确的。对于varStr的每个元素,您需要做的是在varStr2
  2. 中测试具有相同subjectId的对象是否存在于任何位置
  3. 您的目标是更新varStr中的对象。但这不是你正在做的事情:你正在推动(即添加)新元素到varStr
  4. varStr包含您需要更新的对象,但您添加到数组中的对象不是对象。这是一个字符串。
  5. 这是一个详细的固定算法:

    function update(varStr, varStr2) {
        for (var index = 0; index < varStr.length; index++) {
            var currentObject = varStr[i];
            var currrentSubjectId = currentObject.subjectId;
            currentObject.isSelected = existsObjectWithGivenSubjectId(currentSubjectId, varStr2);
        }
    }
    
    function existsObjectWithGivenSubjectId(subjectId, array) {
        for (var i = 0; i < array.length; i++) {
            if (array[i].subjectId === subjectId) {
                return true;
            }
        }
        return false;
    }
    

    现在,这应该通过使用数组函数以更短的方式编写,但是你应该先采用这种方式来理解该版本。

    您还应该为变量选择更好的名称。将它们命名为varXxx是没用的。变量是变量,var不需要在其名称中。你将它们命名为varStr,它建议它们是string类型,这是不正确的:它们是对象数组。 Andyour变量名称不会告诉它们包含什么。例如,您的变量可以命名为originalSubjectsselectedSubjects

    最后,将所有对象键括在引号中会使代码的可读性降低。使用字符串作为subjectIds也很奇怪,因为它们似乎是整数。您可以改用以下代码:

    $scope.varStr = [
        {
            subjectId: 1,
            subjectShortName: "English"
        },
        {
            subjectId: 2,
            subjectShortName: "French"
        }...
    ];
    

答案 1 :(得分:0)

尝试使用波纹管循环它会对你有用。

for (i = 0; i < $scope.varStr.length; i++) {

  $scope.varStr[i].IsSelected = false;
  for (j = 0; j < $scope.varStr2.length; j++) {
    if ($scope.varStr[i].subjectId == $scope.varStr2[j].subjectId) {
      $scope.varStr[i].IsSelected = true;
    }
  }
}