比较数组并删除不匹配的值

时间:2014-09-17 14:24:22

标签: javascript jquery angularjs

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

3 个答案:

答案 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通常是一个坏主意)