说我有一个功能:
function linesReverser(lines) {
var localLines = lines.slice();
localLines[1].reverse();
return _.flatten(localLines);
}
并像这样使用它:
var input = [["Hello"],["Hello", "World"]["Attention", "Please"]];
var output1 = linesReverser(input); //["Hello", "World", "Hello", "Attention", "Please"]
var output2 = linesReverser(input); //["Hello", "Hello", "World", "Attention", "Please"]
注意如何共享对象引用。我是JS的新手,但我认为复制这些值可以缓解这个问题(line.slice()
),但它似乎不起作用。这是因为嵌套数组吗?
我如何非破坏性/不可逆地执行逆转?
答案 0 :(得分:8)
您可以使用ES6的散布运算符复制阵列,然后以破坏性的方式复制复制项:
const arr1 = [1,2,3];
const arr2 = [...arr1].reverse();
// arr1 => [1,2,3]
// arr2 => [3,2,1]
答案 1 :(得分:5)
你正在制作lines
数组的浅表副本。要复制嵌套数组,需要对每个数组进行切片。
var localLines = lines.map(function(arr) {
return arr.slice();
});
.map
方法将返回一个新的返回值数组,它是每个嵌套数组的一个切片。
FWIW,这是一个可以在现代浏览器中使用的较短版本,但我可能会坚持使用第一个版本。
var localLines = lines.map(Array.apply.bind(Array, null));
答案 2 :(得分:2)
在Javascript中反转数组的非破坏性方法
<强> ES6 强>
var array = [1,2,3];
array.reduce((ary, ele) => {ary.unshift(ele); return ary}, []);
// => [3,2,1];
// array => [1,2,3];
<强> ES5 强>
array.reduce(function(obj, ele){
obj.unshift(ele);
return obj;
},[]);