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

时间:2017-05-24 11:31:45

标签: javascript arrays algorithm array-splice

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

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"阵列。我该如何实现此功能?或者我应该使用其他技术吗?

3 个答案:

答案 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