在Javascript中非破坏性地反转数组

时间:2013-01-22 01:33:12

标签: javascript

说我有一个功能:

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()),但它似乎不起作用。这是因为嵌套数组吗?

我如何非破坏性/不可逆地执行逆转?

3 个答案:

答案 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;
},[]);