배열에서 하위 배열을 얻는 방법?


답변:


408

보세요 Array.slice(begin, end)

const ar  = [1, 2, 3, 4, 5];

// slice from 1..3 - add 1 as the end index is not included

const ar2 = ar.slice(1, 3 + 1);

console.log(ar2);


22
원본 ar이 수정되지 않았다는 것을 분명히 언급 할 가치가 있습니다. console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina

17

의 간단한 사용을 slice위해 내 확장을 배열 클래스로 사용하십시오.

Array.prototype.subarray = function(start, end) {
    if (!end) { end = -1; } 
    return this.slice(start, this.length + 1 - (end * -1));
};

그때:

var bigArr = ["a", "b", "c", "fd", "ze"];

시험 1 :

bigArr.subarray(1, -1);

<[ "b", "c", "fd", "ze"]

테스트 2 :

bigArr.subarray(2, -2);

<[ "c", "fd"]

테스트 3 :

bigArr.subarray(2);

<[ "c", "fd", "ze"]

다른 언어 (예 : Groovy)에서 온 개발자가 더 쉬울 수 있습니다.



K_7의 말; 특히, Builtins (Object, Array, Promise 등)를 원숭이 패치하는 것은 매우 좋지 않습니다. 의 유명한 예를 참조 이름 바꾸기 강제 Mootools의 제안 네이티브 Array.prototype.contains로를 Array.prototype.includes.
daemonexmachina

말할 것도없이이 subarray방법은 예기치 않은 결과를 제공합니다. bigArr.slice(1,-1)반환 ['b','c','fd']당신이 기대하는 것,합니다 (-1 새로운 배열의 마지막을 지나고 하나 개의 요소를 두 드린다). 그러나 위치 1에서 끝까지 모든 것을 말하는 bigArr.subarray(1,-1)것과 동일하게 반환합니다 . 또한 사용자가 항상 음수를 매개 변수 로 지정하도록 강요하고 있습니다 . 어떤 경우와 동일한 결과를 제공합니다 . 반면에는을 반환 하며 이는 다시 예상됩니다. bigArr.subarray(1)bigArrendend >= -1end === undefinedbigArr.slice(1,3)['b','c']
daemonexmachina

5

const array_one = [11, 22, 33, 44, 55];
const start = 1;
const end = array_one.length - 1;
const array_2 = array_one.slice(start, end);
console.log(array_2);


여기서 수정 사항을 컴파일하지 않습니다. var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice (0, array_one.length-1); console.log (
ar2

0

질문 은 실제로 New array을 요구 하므로 Abdennour TOUMI의 답변 을 복제 함수와 결합하는 것이 더 나은 해결책이라고 생각 합니다.

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  const copy = obj.constructor();
  for (const attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}

// With the `clone()` function, you can now do the following:

Array.prototype.subarray = function(start, end) {
  if (!end) {
    end = this.length;
  } 
  const newArray = clone(this);
  return newArray.slice(start, end);
};

// Without a copy you will lose your original array.

// **Example:**

const array = [1, 2, 3, 4, 5];
console.log(array.subarray(2)); // print the subarray [3, 4, 5, subarray: function]

console.log(array); // print the original array [1, 2, 3, 4, 5, subarray: function]

[ http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object]


9
슬라이스가 원래 배열을 변경한다고 생각하지 않습니다.
Mani

10
Array.prototype.slice이미 사본을 반환합니다. Array.prototype.splice원래 배열을 수정합니다.
Guido Bouman

2
slice () 메서드는 배열 일부의 얕은 복사본을 새 배열 객체로 반환합니다. Mozilla 개발자 네트워크를 참조하십시오 . 공감.
TheCrazyProgrammer 2016 년

다른 사람들이 말했듯이 slice이미 얕은 사본을 반환 하므로이 subarray구현이 필요하지 않습니다. 그러나 내장 객체를 원숭이가 패치 한 것은 언급 할 가치가 있습니다. Abdennour TOUMI의 답변 에 대한 의견을 참조하십시오 .
daemonexmachina
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.