배열에서 처음 N 개의 요소를 얻는 방법


383

Javascript (ES6) / FaceBook 반응으로 작업하고 크기가 다른 배열의 처음 3 요소를 얻으려고합니다. Linq take (n)와 동일하게 수행하고 싶습니다.

내 Jsx 파일에는 다음이 있습니다.

var items = list.map(i => {
  return (
    <myview item={i} key={i.id} />
  );
});

그런 다음 처음 시도한 3 가지 항목을 얻으려면

  var map = new Map(list);
    map.size = 3;
    var items = map(i => {
      return (<SpotlightLandingGlobalInboxItem item={i} key={i.id} />);
    });

지도에 설정된 기능이 없으므로 작동하지 않았습니다.

도와주세요?


4
어쩌면 나는 문제를 오해하고 있지만 왜 그런 것을 사용하고 list.slice(0, 3);그것을 반복하지 않습니까?
Jesse Kernaghan

왜 맵을 사용하고 싶습니까? 요구 사항을 올바르게 이해하면 slice를 사용하여 첫 번째 n 요소를 취할 수 있습니다.
Abhishek Jain

선생님이지도를 사용하라고 하셨나요? :) 이것이 합법적 인 질문이라면 유감이지만, 숙제처럼 느껴졌습니다.
diynevala 2016 년

수락 된 답변을 대중에게 더 유용한 것으로 변경하십시오
Brian Webster

답변:


401

나는 당신이 찾고있는 것이 믿습니다.

// ...inside the render() function

var size = 3;
var items = list.slice(0, size).map(i => {
    return <myview item={i} key={i.id} />
}

return (
  <div>
    {items}
  </div>   
)


30

이것은 놀랍지 만 length배열의 속성은 여러 배열 요소를 얻는 데 사용될뿐만 아니라 쓰기 가능하며 배열의 길이 MDN 링크 를 설정하는 데 사용될 수 있습니다 . 배열이 변경됩니다.

현재 배열이 더 이상 필요하지 않고 불변성에 신경 쓰지 않거나 메모리를 할당하지 않으려는 경우, 즉 게임에 가장 빠른 방법은

arr.length = n

배열을 비우려면

arr.length = 0

이것이보다 빠르다고 확신 arr = []합니까?
GrayedFox

3
여기서 이점은 메모리 할당을 피하는 것입니다. 게임에서 런타임에 새 객체를 초기화하면 가비지 콜렉터와 k이 트리거됩니다.
Pawel

이로 인해 배열이 변경되고 슬라이스가 얕은 사본을 반환합니다. 영구적으로 잘린 항목을 사용해야하는 경우 큰 차이가됩니다.
Ynot

1
@Ynot ok, 좀 더 분명하게 해줄 게요
Pawel

4
배열이 N보다 작 으면 배열을 확장 할 것입니다.
Oldrich Svec

13

지도 기능을 사용하여 시도하지 마십시오. 맵 기능을 사용하여 한 값에서 다른 값으로 값을 맵핑해야합니다. 입력 및 출력 수가 일치하는 경우

이 경우 어레이에서도 사용 가능한 필터 기능을 사용하십시오. 필터 기능은 특정 기준에 맞는 값을 선택적으로 가져 오려는 경우에 사용됩니다. 그런 다음 코드를 작성할 수 있습니다

var items = list
             .filter((i, index) => (index < 3))
             .map((i, index) => {
                   return (
                     <myview item={i} key={i.id} />
                   );
              });

1
전반적으로 정확하지만 의미 적으로 필터를 사용하여 먼저 요소 집합을 필터링 한 다음이 접근법을 사용하는 경우 필터링 된 집합을 매핑해야합니다.
Chris

8
필터 함수는 배열의 모든 요소를 ​​통과하지만 슬라이스는 그렇지 않으므로 슬라이스를 사용하는 것이 성능면에서 더 좋습니다.
elQueFaltaba 2016 년

11

index배열을 사용하여 필터링 할 수 있습니다 .

var months = ['Jan', 'March', 'April', 'June'];
months = months.filter((month,idx) => idx < 2)
console.log(months);


2
.filter적어도 입력 배열이 길다면 그 자체로는 좋은 선택이 아닙니다. .filter배열의 모든 요소를 ​​검사하여 상태를 확인합니다. .slice이 작업을 수행하지는 않지만 첫 번째 n 요소를 추출한 다음 처리를 중지하면 긴 목록을 원할 것입니다. (AS @elQueFaltaba는 이미 다른 대답 설명했다.)
MikeBeaton

9

다음은 나를 위해 일했습니다.

array.slice( where_to_start_deleting, array.length )

여기에 예가 있습니다

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.slice(2, fruits.length);
//Banana,Orange  ->These first two we get as resultant

4
첫 번째 예에서는을 사용 slice하고 두 번째 예에서는 을 사용 splice합니다.
Veslav

3
이것도 잘못되었습니다. 당신은 ["Apple", "Mango"]이것에서 얻을 것 입니다. 슬라이스의 첫 번째 부분은 "삭제를 시작할 위치"가 아니라 슬라이스를 시작할 위치입니다. 원래 배열을 수정하지 않으며 아무것도 삭제하지 않습니다.
Angel Joseph Piscola


0

필터 사용

가장 좋은 방법은 아니지만 다른 방법

const cutArrByN = arr.filter((item, idx) => idx < n);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.