IT박스

참조가 아닌 다차원 배열의 복사본 만들기-JavaScript

itboxs 2021. 1. 8. 08:00
반응형

참조가 아닌 다차원 배열의 복사본 만들기-JavaScript


중복 가능성 :
JavaScript 객체를 복제하는 가장 효율적인 방법은 무엇입니까?

이것은 또한 내가 몇 가지 기사를 찾은 "깊은 복사"라고도합니다. 가장 가까운 것 같다 이것 하지만 jQuery를위한거야 - 나는 라이브러리없이이 작업을 수행하기 위해 노력하고있어.

나는 또한 두 곳에서 다음과 같은 일을 할 수 있음을 보았습니다.

arr2 = JSON.decode(JSON.encode(arr1));

그러나 그것은 분명히 비효율적입니다. 또한 각 값을 개별적으로 반복하고 복사 할 수 있으며 모든 배열을 통해 반복됩니다. 그것은 피곤하고 비효율적 인 것 같습니다.

그렇다면 JavaScript 다차원 배열을 복사하는 가장 효율적인 비 라이브러리 방법은 [[a],[b],[c]]무엇입니까? 필요한 경우 "비 IE"방법에 완전히 만족합니다.

감사!


배열의 배열을 알려지지 않은 수준의 깊이로 처리하는 것처럼 들리지만 주어진 시간에 한 수준 깊이에서만 처리하면되므로 간단하고 빠르게 사용할 수 있습니다 .slice().

var newArray = [];

for (var i = 0; i < currentArray.length; i++)
    newArray[i] = currentArray[i].slice();

또는 루프 .map()대신 사용 for:

var newArray = currentArray.map(function(arr) {
    return arr.slice();
});

따라서 이것은 현재 배열을 반복하고 중첩 배열의 얕은 복사본의 새 배열을 만듭니다. 그런 다음 다음 수준의 깊이로 이동하면 동일한 작업을 수행합니다.

물론 배열과 기타 데이터가 혼합되어있는 경우 분할하기 전에 무엇이 있는지 테스트해야합니다.


내가 얼마나 잘 모르겠어요 JSON.stringyJSON.parse보다 encode하고 decode,하지만 당신은 시도 할 수 있습니다 :

JSON.parse(JSON.stringify(array));

내가 찾은 다른 것 (조금 수정했지만) :

http://www.xenoveritas.org/blog/xeno/the-correct-way-to-clone-javascript-arrays

function deepCopy(obj) {
  if (typeof obj == 'object') {
    if (isArray(obj)) {
      var l = obj.length;
      var r = new Array(l);
      for (var i = 0; i < l; i++) {
        r[i] = deepCopy(obj[i]);
      }
      return r;
    } else {
      var r = {};
      r.prototype = obj.prototype;
      for (var k in obj) {
        r[k] = deepCopy(obj[k]);
      }
      return r;
    }
  }
  return obj;
}

As you asked for performance, I guess you also would go with a non-generic solution. To copy a multi-dimensional array with a known number of levels, you should go with the easiest solution, some nested for-loops. For your two-dimensional array, it simply would look like this:

var len = arr.length,
    copy = new Array(len); // boost in Safari
for (var i=0; i<len; ++i)
    copy[i] = arr[i].slice(0);

To extend to higher-dimensional arrays, either use recursion or nested for loops!

The native slice method is more efficient than a custom for loop, yet it does not create deep copies, so we can use it only at the lowest level.


Any recursive algorithm that doesn't visit the same node twice will be about as efficient as you get with javascript (at least in a browser) - in certain situations in other languages you might get away with copying chucks of memory, but javascript obviously doesn't have that ability.

I'd suggest finding someone who's already done it and using their implementation to make sure you get it right - it only needs to be defined once.

ReferenceURL : https://stackoverflow.com/questions/13756482/create-copy-of-multi-dimensional-array-not-reference-javascript

반응형