Как получить первое N количество элементов из массива

190

Я работаю с 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} />);
    });

Это не сработало, так как у карты нет заданной функции.

Можете ли вы помочь?

  • 2
    Может быть, я неправильно понимаю проблему, но почему бы не использовать что-то вроде list.slice(0, 3); а затем повторить это?
  • 0
    Почему вы хотите использовать карту? Если я правильно понимаю ваше требование, вы можете просто использовать слайс, чтобы взять первые n элементов.
Показать ещё 2 комментария
Теги:

6 ответов

189
Лучший ответ

Я считаю, что вы ищете:

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

Чтобы получить первые n элементы массива, используйте

array.slice(0, n);
  • 14
    Обратите внимание, что функция slice для массивов возвращает поверхностную копию массива и не изменяет исходный массив. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
12

Это может быть удивительным, но свойство length массива используется не только для получения количества элементов массива, но также доступно для записи и может использоваться для установки MDN-ссылки на длину массива. Это изменит массив.

Если текущий массив больше не нужен, и вы не заботитесь об неизменности или не хотите выделять память, то есть для игры самый быстрый способ

arr.length = n

очистить массив

arr.length = 0
  • 0
    Вы уверены, что это быстрее, чем arr = [] ?
  • 0
    Преимущество здесь заключается в избежании выделения памяти. Инициализация новых объектов во время выполнения, то есть для игр, запускает сборщик мусора и мусор.
Показать ещё 2 комментария
7

Не пытайтесь делать это с помощью функции карты. Функция карты должна использоваться для сопоставления значений от одной вещи к другой. Когда количество входных и выходных данных соответствует.

В этом случае используйте функцию фильтра, которая также доступна в массиве. Функция фильтра используется, когда вы хотите выборочно принимать значения, обрабатывающие определенные критерии. Затем вы можете написать свой код, например

var items = list
             .filter((i, index) => (index < 3))
             .map((i, index) => {
                   return (
                     <myview item={i} key={i.id} />
                   );
              });
  • 1
    В целом вы правы, но семантически вы должны использовать фильтр, чтобы сначала отфильтровать набор элементов, а затем сопоставить отфильтрованный набор, если вы используете этот подход.
  • 2
    Функция фильтра будет проходить через все элементы в массиве, а срез - нет, поэтому лучше использовать срез, не так ли?
Показать ещё 1 комментарий
1

Следующее сработало для меня.

array.slice( where_to_start_deleting, array.length )

Вот пример

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.splice(2, fruits.length);
//Banana,Orange
0

Вы можете фильтровать, используя index массива.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню