【发布时间】:2017-03-09 07:25:20
【问题描述】:
我正在尝试编写一个函数,它遍历对象数组,并推入新对象(具有唯一名称的对象),同时更新已经看到的对象。
比如说,我有这个数组:
$scope.myArray = [
{ "name": "Apple", "total": 16, "applicable": 21 },
{ "name": "Cherry", "total": 12, "applicable": 27 },
{ "name": "Plum", "total": 14, "applicable": 21 },
{ "name": "Apple", "total": 16, "applicable": 21 },
{ "name": "Cherry", "total": 12, "applicable": 27 },
{ "name": "Plum", "total": 14, "applicable": 21 },
{ "name": "Banana", "total": 14, "applicable": 21 },
];
到函数结束时,新数组应该是:
$scope.myNewArray = [
{ "name": "Apple", "total": 32, "applicable": 42},
{ "name": "Cherry", "total": 24, "applicable": 54},
{ "name": "Plum", "total": 28, "applicable": 42},
{ "name": "Banana", "total": 14, "applicable": 21 },
];
这是我目前所拥有的:
$scope.myArray = [
{ "name": "Apple", "total": 16, "applicable": 21 },
{ "name": "Cherry", "total": 12, "applicable": 27 },
{ "name": "Plum", "total": 14, "applicable": 21 },
{ "name": "Apple", "total": 16, "applicable": 21 },
{ "name": "Cherry", "total": 12, "applicable": 27 },
{ "name": "Plum", "total": 14, "applicable": 21 },
{ "name": "Banana", "total": 14, "applicable": 21 },
];
$scope.myNewArray = [];
$scope.myArray.filter( function () {
var i = $scope.myNewArray.indexOf($scope.myArray.name);
if ($scope.myNewArray.indexOf($scope.myArray.name) < 0)
$scope.myNewArray.push($scope.myArray);
else {
$scope.myNewArray[i].total += $scope.myArray.total;
$scope.myNewArray[i].applicable += $scope.myArray.applicable;
}
});
我遇到的问题是所有内容都被推入新数组。那我相信我将值添加到上一条记录的 else 语句可能是错误的。
此外,为每个名称硬编码一个数组是行不通的,因为这只是一个带有小数据集的简单示例。
有人可以帮忙吗?
【问题讨论】:
-
我要做的就是简单地使用 angular forEach ,在你的情况下,我会制作三个不同的数组并用这些信息填充它们。然后我会对它们使用 indexof 并将它们推送到 myNewArray。处理简单数组比处理数组对象更容易。
-
@ThatBird 希望我能做到这一点,不幸的是,这只是我想要完成的一个简单版本。所以在这个例子中,三个数组可以工作,但对于更大的数据集,它就不行了。另外,使用您建议的方法,这不会是动态的。而是硬编码
-
嗯,我已经用这种方法处理了大约 50,000 个值(大部分超过这个值),我从来没有遇到任何麻烦。虽然是的,但您必须事先知道您将在数据对象中收到什么(在您的情况下为 myArray)
-
@thatbird,你是对的 :) 可能不得不采用这个解决方案
-
我也会将此作为答案发布,如果您遇到问题,请告诉我!
标签: angularjs arrays object indexof