Cách lấy số N phần tử đầu tiên từ một mảng


384

Tôi đang làm việc với Javascript (ES6) / FaceBook phản ứng và cố gắng để có được 3 yếu tố đầu tiên của một mảng có kích thước khác nhau. Tôi muốn làm tương đương với Linq mất (n).

Trong tập tin Jsx của tôi, tôi có những điều sau đây:

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

Sau đó, để có được 3 mục đầu tiên tôi đã thử

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

Điều này không hoạt động vì bản đồ không có chức năng thiết lập.

Bạn có thể vui lòng giúp đỡ?


4
Có lẽ tôi đang hiểu sai vấn đề, nhưng tại sao không sử dụng cái gì đó như thế list.slice(0, 3);và sau đó lặp đi lặp lại?
Jesse Kernaghan

Tại sao bạn muốn sử dụng bản đồ? Nếu tôi hiểu chính xác yêu cầu của bạn, bạn chỉ có thể sử dụng lát cắt để lấy n phần tử đầu tiên.
Abhishek Jain

Nếu giáo viên bảo dùng bản đồ? :) Tôi xin lỗi nếu đây là một câu hỏi chính đáng, nhưng nó chỉ cảm thấy như một bài tập về nhà.
diynevala

Vui lòng xem xét việc thay đổi câu trả lời được chấp nhận thành câu trả lời đã được chứng minh hữu ích hơn cho công chúng
Brian Webster

Câu trả lời:


401

Tôi tin rằng những gì bạn đang tìm kiếm là:

// ...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

Điều này có thể gây ngạc nhiên nhưng lengththuộc tính của một mảng không chỉ được sử dụng để lấy số lượng phần tử mảng mà còn có thể ghi và có thể được sử dụng để đặt liên kết MDN có độ dài của mảng . Điều này sẽ đột biến mảng.

Nếu mảng hiện tại không còn cần thiết nữa và bạn không quan tâm đến tính bất biến hoặc không muốn phân bổ bộ nhớ, tức là cho trò chơi, cách nhanh nhất là

arr.length = n

để trống một mảng

arr.length = 0

bạn có chắc là cái này nhanh hơn arr = []không?
GrayedFox

3
Lợi ích ở đây là tránh phân bổ bộ nhớ. Khởi tạo các đối tượng mới trong thời gian chạy i..e cho các trò chơi đang kích hoạt trình thu gom rác và jank.
Pawel

Đáng nói là điều này sẽ làm thay đổi mảng, trong đó lát sẽ trả về một bản sao nông. Điều này trở thành một sự khác biệt lớn nếu bạn cần sử dụng các vật phẩm mà bạn vừa cắt ngắn vĩnh viễn.
Ynot

1
@ Không, ok, tôi sẽ làm cho nó rõ ràng hơn một chút
Pawel

4
Điều này cũng sẽ mở rộng mảng nếu nó nhỏ hơn N
Oldrich Svec

13

Đừng thử làm điều đó bằng cách sử dụng chức năng bản đồ. Chức năng bản đồ nên được sử dụng để ánh xạ các giá trị từ thứ này sang thứ khác. Khi số lượng đầu vào và đầu ra khớp nhau.

Trong trường hợp này, sử dụng chức năng lọc cũng có sẵn trên mảng. Chức năng lọc được sử dụng khi bạn muốn chọn lọc lấy các giá trị gia công các tiêu chí nhất định. Sau đó, bạn có thể viết mã của bạn như

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

1
Bạn đúng tổng thể, nhưng ngữ nghĩa bạn nên sử dụng bộ lọc để đầu lọc xuống tập các phần tử, sau đó, lập bản đồ các bộ lọc xuống nếu bạn đang dùng phương pháp này.
Chris

8
Hàm bộ lọc sẽ đi qua tất cả các phần tử trong mảng, trong khi lát cắt thì không, vì vậy nên sử dụng lát cắt tốt hơn, phải không?
elQueFaltaba

11

Bạn có thể lọc bằng cách sử dụng indexmảng.

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


2
.filtertrên chính nó không phải là một lựa chọn tuyệt vời, ít nhất là không nếu mảng đầu vào có thể dài. .filterđi qua mọi phần tử của mảng kiểm tra điều kiện của nó. .slicesẽ không làm điều này, nhưng sẽ chỉ trích xuất n phần tử đầu tiên và sau đó dừng xử lý - đó chắc chắn sẽ là những gì bạn muốn cho một danh sách dài. (Như @elQueFaltaba đã nói trong phần bình luận cho câu trả lời khác.)
MikeBeaton

9

Sau đây làm việc cho tôi.

array.slice( where_to_start_deleting, array.length )

Đây là một ví dụ

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

4
Trong ví dụ đầu tiên bạn sử dụng slicenhưng trong lần thứ hai bạn sử dụng splice.
Veslav

3
Điều này cũng sai. Bạn sẽ nhận được ["Apple", "Mango"]từ điều này. Phần đầu tiên của lát cắt không phải là "nơi bắt đầu xóa", đó là nơi bắt đầu lát. Nó không sửa đổi mảng ban đầu và sẽ không xóa bất cứ thứ gì.
Thiên thần Joseph Piscola


0

Sử dụng bộ lọc

Không phải cách thực hành tốt nhất mà là một cách khác

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.