从数组中删除除特定元素之外的元素

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