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

Dom*_*mra 9 javascript

说我有一个功能:

function linesReverser(lines) {
  var localLines = lines.slice(); 
  localLines[1].reverse(); 
  return _.flatten(localLines);
}
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

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"]
Run Code Online (Sandbox Code Playgroud)

注意如何共享对象引用.我是JS的新手,但我认为复制这些值会缓解这个问题(line.slice()),但它似乎不起作用.这是因为嵌套数组?

我怎样才能非破坏性/不可逆地执行逆转?

Rya*_*ing 17

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

const arr1 = [1,2,3];
const arr2 = [...arr1].reverse();
// arr1 => [1,2,3]
// arr2 => [3,2,1]
Run Code Online (Sandbox Code Playgroud)

  • 这值得更多的支持。考虑到“reverse()”具有破坏性,这是最干净的解决方案。 (4认同)

the*_*tem 5

你正在制作lines数组的浅表副本.要复制嵌套数组,您需要对每个数组进行切片.

var localLines = lines.map(function(arr) {
    return arr.slice();
});
Run Code Online (Sandbox Code Playgroud)

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


FWIW,这是一个可以在现代浏览器中使用的较短版本,但我可能会坚持使用第一个版本.

var localLines = lines.map(Array.apply.bind(Array, null));
Run Code Online (Sandbox Code Playgroud)

  • @JosephSilber:`Array`只是`new Array`构造函数.`.apply`是正常的`Function.prototype.apply`.使用`.bind()`,我们将`.apply()`的`this`值绑定到`Array`函数,将`.apply()`的第一个参数绑定到`null`,所以函数返回将有效地执行`Array.apply(null,...)`.由于`.map`传递的第一个参数是`lines`数组的每个成员,因此调用变为`Array.apply(null,["foo","bar"])`,这与`Array相同("foo","bar")`,给我们一个包含这些成员的新阵列. (2认同)
  • 为什么 [@JosephSilber](http://stackoverflow.com/users/825568/joseph-silber) 删除了他所有的评论??? (2认同)