14

说我有一个功能:

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

我怎样才能非破坏性/不变地执行反向操作?

4

4 回答 4

22

您可以使用 ES6 的扩展运算符复制数组,然后破坏性地反转副本:

const arr1 = [1,2,3];
const arr2 = [...arr1].reverse();
// arr1 => [1,2,3]
// arr2 => [3,2,1]
于 2020-02-13T17:20:40.350 回答
6

您正在制作lines数组的浅拷贝。要复制嵌套数组,您需要对每个数组进行切片。

var localLines = lines.map(function(arr) {
    return arr.slice();
});

.map方法将返回一个新的返回值数组,它是每个嵌套数组的一个切片。


FWIW,这是一个适用于现代浏览器的较短版本,尽管我可能会坚持使用第一个。

var localLines = lines.map(Array.apply.bind(Array, null));
于 2013-01-22T01:36:23.273 回答
4

一种在 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;
},[]);
于 2017-09-21T22:01:53.493 回答
0

您可以使用 JSON.parse 和 JSON.stringify 安全地(深度)复制嵌套数组,因此不共享引用。然后破坏性地反转副本:

let array1 = [[1, 3], [50, 1]];
let arrayCopy = JSON.parse(JSON.stringify(array1));
arrayCopy.reverse(); //[[50,1],[1,3]]

结帐克隆阵列以获取更多信息

于 2021-12-29T09:50:36.920 回答