Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 返回没有删除元素的数组?在不更改阵列的情况下使用splice()?_Javascript_Arrays - Fatal编程技术网

Javascript 返回没有删除元素的数组?在不更改阵列的情况下使用splice()?

Javascript 返回没有删除元素的数组?在不更改阵列的情况下使用splice()?,javascript,arrays,Javascript,Arrays,我想做一些类似的事情: var myArray = ["one","two","three"]; document.write(myArray.splice(1,1)); document.write(myArray); 所以它首先显示“一,三”,然后显示“一,二,三”。我知道splice()返回已删除的元素并更改数组,但是否有函数返回已删除元素的新数组?我试过: window.mysplice = function(arr,inde

我想做一些类似的事情:

var myArray = ["one","two","three"];
document.write(myArray.splice(1,1));
document.write(myArray);
所以它首先显示“一,三”,然后显示“一,二,三”。我知道splice()返回已删除的元素并更改数组,但是否有函数返回已删除元素的新数组?我试过:

window.mysplice = function(arr,index,howmany){
    arr.splice(index,howmany);
    return arr;   
};
如果我尝试:

var myArray = ["one","two","three"];
document.write(mySplice(myArray,1,1));
document.write(myArray);
它仍然会更改myArray。

您需要:

返回数组部分的一级深度副本

所以如果你

a = ['one', 'two', 'three' ];
b = a.slice(1, 3);
然后
a
仍将是
['1','2','3']
b
将是
['2','3']
。请注意
slice
的第二个参数,它比要切片的最后一个索引多一个:

结束提取的从零开始的索引<代码>切片提取到但不包括
结束

与此相反:

document.write(myArray.splice(1,1));
为什么不直接使用:

document.write(myArray[1]);

splice()
根据定义修改在位阵列。看看你是否需要一份副本。

为什么不直接引用索引呢

var myArray = ["one","two","three"];
document.write(myArray[1] + '<br />');
document.write(myArray);
var myArray=[“一”、“二”、“三”];
document.write(myArray[1]+'
'); document.write(myArray);

示例:

如下面的答案所示,下面是一个代码快照

var myArray=[“一”、“二”、“三”];
var cloneArray=myArray.slice();
myArray.剪接(1,1);
log(myArray);
控制台日志(cloneArray)使用以下命令:

function spliceNoMutate(myArray,indexToRemove) {
    return myArray.slice(0,indexToRemove).concat(myArray.slice(indexToRemove+1));
}

我知道这个问题由来已久,但这种方法可能会派上用场

var myArray = ["one","two","three"];
document.write(myArray.filter(function(v, index) { return index !== 1 })

这将使用
Array.filter()
函数并针对索引为1或值为“2”进行测试。

现在,我无法保证这些解决方案的性能(因为它会检查阵列上的每个项目,Nguyen's可能会更有效),但如果您想做更复杂的事情,它会更灵活,而且更容易理解。

您可以使用ES6 spread功能:

let myArray = ['one','two','three'];
let mySplicedArray = [...myArray];
mySplicedArray.splice(1,1); 

console.log(myArray); /// ['one', 'two', 'three']
console.log(mySplicedArray); /// ['one', 'three']

我认为从阵列拼接元素而不进行突变和复制的最佳方法是使用过滤器:

arr = ["one", "two", "three"]
elToRemove = "two"
filteredArr = arr.filter( n => n != elToRemove)

console.log(arr) // ["one", "two", "three"]
console.log(filteredArr) // ["one", "three"]

我认为最简洁的方法是创建一个简单的函数,如果需要全局访问,则将函数绑定到阵列原型

对这个问题的大多数回答都是错误的。人们会混淆返回一个数组的一个元素而不修改其内容,但OP需要的是返回一个没有一个元素的数组克隆

以下是我的解决方案:

让arr=['1','2','3'];
/*功能性*/
window.cloneSlice=(arr、start、end)=>{
常数arr=arr.slice();
_arr.拼接(开始、结束);
返回_arr;
}
//用法
console.log(cloneSlice(arr,1,1));//一,三
console.log(arr);//一,二,三
/*原型*/
Array.prototype.cloneSlice=函数(开始,结束){返回cloneSlice(这个,开始,结束)}
//用法
console.log(arr.cloneSlice(1,1));//一,三
console.log(arr);//一、二、三

const onetwother=['1','2','3']//原始数组
//`filter()`(与大多数数组函数一样)迭代数组中的每个项。
//此处返回true的内容将复制到新数组(“oneThree”变量)。
//`item!=='two'`返回除'two'以外的所有值
const oneThree=onetwotree.filter(item=>item!=='two')
log(onetwother)/['one','two','three']-原始的、未受破坏的数组
log(oneThree)/['one','three']-原始文件的副本,不包含要删除的值
您希望这样做,这样您就有了一个非变异的数组

我认为性能不如
slice
+
concat
那样好,但如果它成为一个问题(除非处理数组中的成千上万个元素,否则可能不会)。在那之前,
过滤器
是非常干净的

还要注意,这将从数组中删除元素
two
的所有实例,因此请确保数组中没有重复的元素,它们可能会被这种方法无意中吞噬


为什么要无缘无故地将内存使用率提高一倍?谢谢。这里是否正在创建指针?我不明白它为什么要更改原始数组……作者实际上想要删除元素的数组[“一”、“三”],而不是删除的元素(“二”)。@Neverever
myArray
是删除元素的数组
cloneArray
是一个新数组,其原始内容保持完整。
myArray
将包含从
myArray
副本中删除的元素(['two']),而不是原始数组减去删除的元素(['one','three'])。作者想要后者。我想作者会希望这样:
让mysplicateray=[…myArray];mysplicdaray.拼接(1,1);log(myArray)哪个结果是['1','3'],这是如何得到提升的?这不是给OP问题一个解决方案。。。OP希望调用一个函数,该函数返回不带一个元素的数组,而不修改原始数组。您建议调用一个函数,该函数将返回数组的一个元素,而不修改原始元素。不合适。这是错误的,a将是['1']。谁对此投了赞成票?@MedunoyeLaxusGbenga你想的是splice,它改变了原来的数组,slice实际上返回一个副本(虽然是肯定的,slice和splice并没有直观地联系在一起,我认为他们可以更好地设计)。是的,@JimJam我把这一部分误认为是公认的on,我的不好。如果数组中有重复的项,但只想删除一个,怎么办?为什么要使用
\uu
作为参数名?通常情况下,这是针对你不打算使用论点的时候,如果你打算使用它,你会给它起个名字,这两个都是很好的观点。根据我的经验,大多数时候,当你想做OP建议的事情时,你并不是在处理重复的事情(例如,一个国家或什么的列表)——但你是对的,这是值得注意的
arr = ["one", "two", "three"]
elToRemove = "two"
filteredArr = arr.filter( n => n != elToRemove)

console.log(arr) // ["one", "two", "three"]
console.log(filteredArr) // ["one", "three"]
const getSubArr = (arr, start, end) => {
    return end > start
        ? arr.filter((_, i) => i >= start && i < end)
        : arr.filter((_, i) => i >= start || i < end);
};
const chars = ["a", "b", "c", "d", "e", "f"];
console.log(getArrInRange(chars, 2, 4));
console.log(getArrInRange(chars, 4, 2));
document.write(myArray.filter(e => e !== "two"));
document.write(myArray);