$scope.locations = [
{ name : "One"},
{ name : "Two"},
{ name : "Three"},
{ name : "India"},
{ name : "Japan"},
{ name : "China"}
];
$scope.tempLocations = [
{ name : "One"},
{ name : "Two"},
{ name : "global"},
];
我有两个数组。如果location
未包含tempLocations
中的某些名称,我想将其从tempLocation
中删除。在这种情况下,我想删除位置全局
我尝试了以下操作,但无效。
for(var i=0;i<$scope.tempLocations.length;i++){
var index = $scope.tempLocations.indexOf($scope.locations[i]);
if(index == -1){
console.log($scope.tempLocations[i]);
$scope.tempLocations.splice(i,1);
}
}
答案 0 :(得分:3)
我猜你正在寻找这个
$scope = {}
$scope.locations = [
{ name : "One"},
{ name : "Two"},
{ name : "Three"},
{ name : "India"},
{ name : "Japan"},
{ name : "China"}
];
$scope.tempLocations = [
{ name : "One"},
{ name : "Two"},
{ name : "global"},
];
$scope.tempLocations = $scope.tempLocations.filter(function(x) {
return $scope.locations.some(function(y) {
return x.name == y.name
})
})
document.getElementById("output").innerHTML = JSON.stringify($scope.tempLocations, 0,' ');
console.log($scope);
<pre id="output"></pre>
如果您有多个(100多个)位置,请考虑先将它们转换为“关联数组”,例如:
validLocations = { "One": 1, "Two": 1 ... etc
答案 1 :(得分:2)
你需要手动循环,因为Paul S.的评论建议:
var locations = [
{ name : "One"},
{ name : "Two"},
{ name : "Three"},
{ name : "India"},
{ name : "Japan"},
{ name : "China"} ];
var tempLocations = [
{ name : "One"},
{ name : "Two"},
{ name : "global"},
];
var newTempLocations = tempLocations.filter(function(temp){
return locations.some(function(location){ // stop and return true at first match
return location.name === temp.name;
});
})
// print output
document.getElementById("output").innerHTML = JSON.stringify(newTempLocations, null, " ");
<pre id="output"></pre>
答案 2 :(得分:1)
如果$scope.locations
不经常更改,您可以执行以下操作:
为位置构建查找表
var location_lookup = {};
for ( var i = 0; i < $scope.locations.length; i++ ) {
location_lookup[$scope.locations[i].name] = true;
}
根据密钥的存在进行过滤
$scope.filteredLocations = $scope.tempLocations.filter(function(temp) {
return location_lookup.hasOwnProperty(temp.name);
});
如果您进行过滤的频率高于重新计算查询所需的速度,则证明速度会快得多。因此,如果$scope.locations
是静态的,那么这将是一条很好的路线。
我建议反对使用temp.name in location_lookup
作为另一张海报说,因为那样也会检查location_lookup
对象的所有原型属性。例如,如果您应用中的另一个脚本执行Object.prototype.global = function(){}
,则过滤器将返回&#34; global&#34;作为$scope.locations
的一部分,这不是你想要的行为。 hasOwnProperty
只会检查对象本身而不是任何原型继承,同时也是一种更有效的方法。
小提琴演示:http://jsfiddle.net/cu33ojfy/(还包括一个使用Array.prototype添加.filter_locations()
方法的实现,但添加到Array.prototype通常是一个坏主意)