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のspread演算子を使用して配列を複製してから、複製を破壊的に逆にすることができます。

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 に答える