我有:
var a = [1,2,3,4,5,6,7,8,9]
我正在尝试:
var b = [];
b.concat(a.slice(0,3), a.slice(-3))
结果我得到了:
b == []
如何从b
的数组中获取3个第1个和第3个最后的元素?
答案 0 :(得分:5)
concat
无法在阵列上内联工作。必须抓住concat()
的结果。
concat()
方法返回一个新数组,该数组由调用它的数组组成,并与作为参数提供的数组和/或值连接。
您没有更新b
数组的值。
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var b = [].concat(a.slice(0, 3), a.slice(-3));
document.write(b);
console.log(b);

您还可以concat
切片阵列。
var a = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var b = a.slice(0, 3).concat(a.slice(-3));
document.write(b);
console.log(b);

答案 1 :(得分:4)
Array.prototype.concat没有副作用,这意味着它不会修改原始数组(即b
)
我看到了两种实现目标的方法:
将concat
的结果分配给b
(它会破坏对原始数组的引用,因为它是一个全新的数组)
b = b.concat(a.slice(0,3), a.slice(-3));
或使用Array.prototype.push和apply
修改b
到位
Array.prototype.push.apply(b, a.slice(0,3).concat(a.slice(-3)));
这个有点棘手。为什么要使用apply
?
因为执行b.push(a.slice(0, 3), a.slice(0 - 3))
会产生不同的结构:[[...], [...]]
有关apply
的详细信息,请参阅Function.prototype.apply
答案 2 :(得分:0)
我理解你。一些较旧的JS数组函数非常愚蠢。它们不会返回您想要的内容push()
,它返回结果数组的长度,而不是返回对结果数组的引用。曾经有一段时间我想要删除一个项目并将结果数组作为参数同时传递给一个函数。这就是你的问题所在。我有一个数组
var arr = [1,2,3,4,5,6,7,8,9];
我希望删除第5项并将数组作为参数传递。假设i
为4。
myRecursiveFunction(arr.splice(i,1));
不会削减。愚蠢的事情会将数组中的已删除元素传递给函数,而不是对被调用数组的引用。但我不想做几个指示。我只想将它作为单个指令的返回值传递给函数。所以我必须想出像这样的发明。
myRecursiveFunction(arr.slice(0,i).concat(arr.slice(i+1)));
任何有更好主意的人请告诉我。