javascript - angularJS更新第二个数组值的数组基数

标签 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"}
             ];

$scope.varStr2 中相似值 subjectId 的基础,更新 $scope.varStr 或使用新 KEY 创建新的 $scope.varStr3,如下所示 "IsSelected": true/false

$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'");
                }
            }

最佳答案

你的代码中有很多问题,而且都是非常基础的问题,所以我建议修改你的算法和 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 包含您需要更新的对象,但您添加到数组中的不是对象。这是一个字符串。

这是详细的固定算法:

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,这表明它们是字符串类型,这是不正确的:它们是对象数组。而且你的变量名并不能说明它们包含什么。例如,您的变量可以命名为 originalSubjectsselectedSubjects

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

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

关于javascript - angularJS更新第二个数组值的数组基数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34555597/

相关文章:

javascript - 将字符串与数组匹配

javascript - PHP 文件不返回 .responseText 中的文本

c# - 在 C# 中将 JSON 变量转换为小写

javascript - TinyMCE setContent 不清除撤销历史

javascript - Grunt 没有看到我的 devDependency 模块

javascript - 语义 UI 下拉菜单需要点击 2 次才能触发

javascript - 是否可以在 SVG 标签上使用点击功能?我在 <polygon> 上尝试了 element.click() 。尝试使用 javascript 模拟点击。不起作用

javascript - 没有隔离范围的指令中的两种方式数据绑定(bind)

javascript - 如何减少带有缩放内容的 div 的可滚动高度?

javascript - rabbitmq中当前队列大小