【发布时间】:2015-10-23 00:06:17
【问题描述】:
我有:
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 个第一个元素和 3 个最后一个元素?
【问题讨论】:
标签: javascript arrays slice concat
我有:
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 个第一个元素和 3 个最后一个元素?
【问题讨论】:
标签: javascript arrays slice concat
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);
【讨论】:
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 的文档
【讨论】:
我理解你。一些较旧的 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)));
任何有更好想法的人请告诉我。
【讨论】: