我有两个数组
arr = [ aaa, xxx, aaa, xxx, aaa ];
foundIn = [ 1, 3 ];
正如您所见, foundIn 的索引号为 arr ,我想删除。如何使用 foundIn
中的索引值删除 arr 中的值The output being: newArr = [ aaa, aaa, aaa ];
这是我的问题的简化版。
非常感谢任何帮助。
答案 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)
您有几种选择。
以反向索引顺序循环遍历foundIn
(例如,最高的第一个;您可以使用sort
对其进行排序)并使用splice
从其他数组中删除它们。
在arr
上使用filter
,并为foundIn
中找不到的索引返回false(但每次都会重新搜索foundIn
)
使用带有索引键的Set
构建一个索引键(或ES2015及以上索引的foundIn
)的对象,然后使用arr.filter
查找地图中的索引,看看是否应删除它们。
前两个是微不足道的,我会把编码留给你。最后一个可能会受益于解释代码:
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
中的所有元素