首页 > 解决方案 > array.splice() 返回我要消除的项目,而不是数组减去项目

问题描述

indexOf()我正在尝试使用建议的withsplice()技术从数组中删除一个项目。这就是正在发生的事情

let someArray: string[] = [first, second, third, fourth, fifth, sixth];
let newArray: string[] = someArray.splice(3, 1);

console.log(newArray);

//deisred result = [first, second, third, fifth, sixth]

//result I'm getting = [fourth]

这并不是我遇到的几乎每一篇文章都说应该发生的事情。有人可以解释一下吗?

更新 我在我的代码中发现了这个问题,当时我只看到了 1 个我期望更多的结果,并将其追溯到这一点。

标签: javascripttypescript

解决方案


因为当你拼接一个数组时,你正在改变它,这意味着你正在改变原始数组。您将结果(您从数组拼接的元素)存储在您在此处创建的“newArray”变量中。所以这:

var arr = [1, 2, 3, 4];

var mine = arr.splice(1, 1);
console.log(mine);
console.log(arr);

如果我们将 arr 打印到控制台,将返回原始射线减去索引一,如果我们将我的打印到控制台,将返回 [2]。要获得您期望的输出,您必须执行不同的操作,例如遍历数组并以不同的方式使用拼接。这是一个例子:

var arr = [1, 2, 3, 4];

var mine = [];

for(var i = 0; i < arr.length; i++) {
    if(i !== 3) {
        mine.push(arr[i]);
    }
}

现在我没有改变原始数组,我只是将元素推送到一个新数组。

但是,如果您想简单地改变原始数组而不是将新数组存储在某种变量中,您可以简单地拼接原始数组:

var arr = [1, 2, 3, 4];

arr.splice(3, 1);
console.log(arr);

但是,如果你将它传递给一个函数,我可能不会在函数之外改变一个数组,我只需返回一个值并将该值存储在一个新变量中:

var arr = [1, 2, 3, 4];


function deleteIndex(ar, i) {
    var a = [];
    ar.forEach(function(elt, index) {
        if(index === i) {

        }
        else {
            a.push(elt);
        }
    });
    return a;
}

var newArr = deleteIndex(arr, 3);
console.log(newArr);

通过这种方式,您可以删除任何索引,或传递您想要用来确定是否应删除索引的函数和标准,而无需通过使用函数式编程更改原始数组的顶级结构。如果是这种情况,下划线模块中还有一些功能可以帮助您。


推荐阅读