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

Luc*_*nik 4 javascript arrays algorithm array-splice

我有两个数组。第一个是索引数组,第二个是对象数组。它们看起来像这样:

var nums = [0, 2];
var obj = [Object_1, Object_2, Object_3];
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我需要删除objobj[0]and之外的所有 " " 元素obj[2]。所以结果将如下所示:

obj = [Object_2]
Run Code Online (Sandbox Code Playgroud)

也有可能出现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
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

问题:如何删除不符合我的条件的元素?我不需要新数组,我想修改现有的“obj”数组。我怎样才能实现这个功能?或者我应该使用其他一些技术?

小智 5

您可以使用过滤器来执行此操作,假设nums是要保留的元素索引的数组。

obj = obj.filter((o, i) => nums.indexOf(i) > -1); 
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 5

您可以检查索引的长度是否与对象数组的长度相同,并返回或删除给定索引处的对象。

它需要一个排序的索引数组,因为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);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)