我使用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'");
}
}
答案 0 :(得分:2)
您的代码中存在许多问题,并且都是非常基本的问题,因此我建议您修改算法和JavaScript的基础知识。我会尝试尽我所能地解释,但这不能取代读一本好书和练习。
让我们检查你的代码:
for (var index = 0; index < varStr.length; index++) {
if (varStr[index].subjectId == varStr2[index].subjectId) {
varStr.push("'IsSelected':'true'");
}
}
这里有三个重要问题:
varStr
和varStr2
中的匹配对象位于同一索引处。但事实并非如此。例如,subjectId=5
的对象在第一个数组中位于索引4处,而在第二个数组中位于索引1处。这是不正确的。对于varStr
的每个元素,您需要做的是在varStr2
varStr
中的对象。但这不是你正在做的事情:你正在推动(即添加)新元素到varStr
。varStr
包含您需要更新的对象,但您添加到数组中的对象不是对象。这是一个字符串。这是一个详细的固定算法:
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变量名称不会告诉它们包含什么。例如,您的变量可以命名为originalSubjects
和selectedSubjects
。
最后,将所有对象键括在引号中会使代码的可读性降低。使用字符串作为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;
}
}
}