我有两个数组。第一个是索引数组,第二个是对象数组。它们看起来像这样:
var nums = [0, 2];
var obj = [Object_1, Object_2, Object_3];
在这种特殊情况下,我需要删除所有" obj
"除obj[0]
和obj[2]
之外的元素。所以结果将如下所示:
obj = [Object_2]
nums = [0, 1, 2]
和obj = [Object_1, Object_2, Object_3]
也可能出现这种情况;在这种情况下,我不需要删除任何元素。
" obj
"长度总是大于" nums"长度。
所以我开始只找到需要保存的元素:
nums.forEach(function(key) {
obj.forEach(function(o, o_key) {
if (key === o_key) {
console.log(key, o);
// deleting remaining elements
}
});
});
问题:如何删除不符合我条件的元素?我不需要新的数组,我想修改现有的" obj"阵列。我该如何实现此功能?或者我应该使用其他技术吗?
答案 0 :(得分:3)
您可以检查索引的长度是否与对象数组的长度相同,并返回或删除给定索引处的对象。
它需要索引的排序数组,因为Array#splice
会更改数组的长度。 (对于具有降序排序索引的数组,您可以使用Array#forEach
而不是Array#reduceRight
。)
function mutate(objects, indices) {
if (objects.length === indices.length) {
return;
}
indices.reduceRight(function (_, i) {
objects.splice(i, 1);
}, null);
}
var objects = [{ o: 1 }, { o: 2 }, { o: 3 }];
mutate(objects, [0, 1, 2]); // keep all items
console.log(objects);
objects = [{ o: 1 }, { o: 2 }, { o: 3 }]; // delete items at index 0 and 2
mutate(objects, [0, 2]);
console.log(objects);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:2)
您可以使用过滤器执行此操作,假设nums
是要保留的元素索引上的数组。
obj = obj.filter((o, i) => nums.indexOf(i) > -1);
答案 2 :(得分:1)
如果要保留相同的数组对象,则需要使用splice
,例如在一个简单的反向for
中,以免弄乱指数:
for (var i=obj.length-1; i>=0; i--) {
if (nums.indexOf(i) < 0) {
obj.splice(i, 1);
}
}
这是假设索引(nums)列表是有序的。如果没有,我们首先需要对其进行排序:
var sortedNums = nums.sort(function (a, b) { return a - b; });
然后使用sortedNums检查indexOf