从数组中删除除特定元素之外的元素
Remove elements from array except particular one
我有两个数组。第一个是索引数组,第二个是对象数组。它们看起来像这样:
var nums = [0, 2];
var obj = [Object_1, Object_2, Object_3];
在这种特殊情况下,我需要删除除 obj[0]
和 obj[2]
之外的所有“obj
”元素。所以结果将如下所示:
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" 数组。我怎样才能实现这个功能?或者我应该使用其他一些技巧?
您可以使用过滤器来执行此操作,假设 nums
是一个包含您要保留的元素索引的数组。
obj = obj.filter((o, i) => nums.indexOf(i) > -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
您可以检查索引的长度是否与对象数组的长度相同,return或者删除给定索引处的对象。
它需要一个排序数组作为索引,因为Array#splice
changes the length of the array. (With an array with descending sorted indices, you could use Array#forEach
instead of 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; }
我有两个数组。第一个是索引数组,第二个是对象数组。它们看起来像这样:
var nums = [0, 2];
var obj = [Object_1, Object_2, Object_3];
在这种特殊情况下,我需要删除除 obj[0]
和 obj[2]
之外的所有“obj
”元素。所以结果将如下所示:
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" 数组。我怎样才能实现这个功能?或者我应该使用其他一些技巧?
您可以使用过滤器来执行此操作,假设 nums
是一个包含您要保留的元素索引的数组。
obj = obj.filter((o, i) => nums.indexOf(i) > -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
您可以检查索引的长度是否与对象数组的长度相同,return或者删除给定索引处的对象。
它需要一个排序数组作为索引,因为Array#splice
changes the length of the array. (With an array with descending sorted indices, you could use Array#forEach
instead of 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; }