使用索引数组过滤另一个数组

时间:2016-08-29 13:36:54

标签: javascript jquery

我有两个数组

arr = [ aaa, xxx, aaa, xxx, aaa ];

foundIn = [ 1, 3 ];

正如您所见, foundIn 的索引号为 arr ,我想删除。如何使用 foundIn

中的索引值删除 arr 中的值
The output being: newArr = [ aaa, aaa, aaa ];

这是我的问题的简化版。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用原生javascript .filter()方法的优势来解决此类问题。

var arr = ["aaa", "xxx", "aaa", "xxx", "aaa"];
var foundIn = [1, 3];
var res = arr.filter(function (eachElem, index) {
    return foundIn.indexOf(index) == -1
})

console.log(res) // ["aaa", "aaa", "aaa"]

解释

回调将在调用此函数的每个循环中执行(在上例中,它将在arr变量上使用)。

将两个参数传递给回调。首先是元素,第二个是索引。因为你需要index,你必须写下所有这两个参数,即使你没有使用第一个参数。

在本期中,index变量用于确定它是否存在于foundIn变量中(我们使用.indexOf()方法进行检查)。如果不存在,则会给出true。因此,所有返回的元素都是foundIn不存在的元素。

.indexOf()返回搜索项目的索引,如果找不到,则返回-1

如果您使用的是es6,则可以简化代码:

var res = arr.filter((d, i) => foundIn.indexOf(i) == -1)

也可以尝试这个工作示例:

var arr = ["aaa", "xxx", "aaa", "xxx", "aaa"];
var foundIn = [1, 3];
var res = arr.filter(function (eachElem, index) {
    return foundIn.indexOf(index) == -1
})

document.write(JSON.stringify(res))
// ["aaa", "aaa", "aaa"]

答案 1 :(得分:0)

您有几种选择。

  1. 以反向索引顺序循环遍历foundIn(例如,最高的第一个;您可以使用sort对其进行排序)并使用splice从其他数组中删除它们。

  2. arr上使用filter,并为foundIn中找不到的索引返回false(但每次都会重新搜索foundIn

  3. 使用带有索引键的Set构建一个索引键(或ES2015及以上索引的foundIn)的对象,然后使用arr.filter查找地图中的索引,看看是否应删除它们。

  4. 前两个是微不足道的,我会把编码留给你。最后一个可能会受益于解释代码:

    
    
    var arr = ["aaa", "xxx", "aaa", "xxx", "aaa"];
    
    var foundIn = [1, 3];
    
    var map = Object.create(null);
    foundIn.forEach(function(entry) {
      map[entry] = true;
    });
    arr = arr.filter(function(_, index) {
      return !map[index];
    });
    
    console.log(arr);
    
    
    

    或在ES2015(又名" ES6")及以上:

    
    
    let arr = ["aaa", "xxx", "aaa", "xxx", "aaa"];
    
    let foundIn = [1, 3];
    let set = new Set(foundIn);
    arr = arr.filter((_, index) => !set.has(index));
    
    console.log(arr);
    
    
    

答案 2 :(得分:-1)

你可以使用filter(el,index)来完成这项工作:

arr.filter(function(el, index) { 
         return foundIn.indexOf(index) > -1;
 });

filter返回一个数组,其中包含条件为它们返回的所有元素。 在我的例子中,它们的索引存在于foundIn

中的所有元素