Для каждого над массивом в JavaScript? - PullRequest
4277 голосов
/ 17 февраля 2012

Как я могу перебрать все записи в массиве, используя JavaScript?

Я думал, что это было примерно так:

forEach(instance in theArray)

Где theArray - мой массив, нокажется неправильным.

Ответы [ 33 ]

7 голосов
/ 09 октября 2018

Использование циклов с ES6 деструктурирование и оператор распространения

Разрушение и использование оператора распространения оказались весьма полезными для новичков в ES6, поскольку они более удобочитаемы / эстетичны, хотя некоторые ветераны javascript могут посчитать это грязным, юниоры или некоторые другие люди могут найти его полезным.

В следующих примерах будут использоваться оператор for...of и метод .forEach.

Примеры 6, 7 и 8 могут использоваться с любыми функциональными циклами, такими как .map, .filter, .reduce, .sort, .every, .some, для получения дополнительной информации. об этих методах посмотрите Array Object .

Пример 1: Обычный for...of цикл - здесь нет хитростей.

let arrSimple = ['a', 'b', 'c'];

for (let letter of arrSimple) {
  console.log(letter);
}

Пример 2: Разделение слов на символы

let arrFruits = ['apple', 'orange', 'banana'];

for (let [firstLetter, ...restOfTheWord] of arrFruits) {
  // Create a shallow copy using the spread operator
  let [lastLetter] = [...restOfTheWord].reverse();
  console.log(firstLetter, lastLetter, restOfTheWord);

}

Пример 3: Цикл с key и value

// let arrSimple = ['a', 'b', 'c'];

// Instead of keeping an index in `i` as per example `for(let i = 0 ; i<arrSimple.length;i++)`
// this example will use a multi-dimensional array of the following format type: 
// `arrWithIndex: [number, string][]`

let arrWithIndex = [
  [0, 'a'],
  [1, 'b'],
  [2, 'c'],
];

// Same thing can be achieved using `.map` method
// let arrWithIndex = arrSimple.map((i, idx) => [idx, i]);

// Same thing can be achieved using `Object.entries`
// NOTE: `Object.entries` method doesn't work on internet explorer unless it's polyfilled
// let arrWithIndex = Object.entries(arrSimple);

for (let [key, value] of arrWithIndex) {
  console.log(key, value);
}

Пример 4: Получить свойства объекта inline

let arrWithObjects = [{
    name: 'Jon',
    age: 32
  },
  {
    name: 'Elise',
    age: 33
  }
];

for (let { name, age: aliasForAge } of arrWithObjects) {
  console.log(name, aliasForAge);
}

Пример 5: Получите глубокие свойства объекта, которые вам нужны

let arrWithObjectsWithArr = [{
    name: 'Jon',
    age: 32,
    tags: ['driver', 'chef', 'jogger']
  },
  {
    name: 'Elise',
    age: 33,
    tags: ['best chef', 'singer', 'dancer']
  }
];

for (let { name, tags: [firstItemFromTags, ...restOfTags] } of arrWithObjectsWithArr) {
  console.log(name, firstItemFromTags, restOfTags);
}

Пример 6: Is Пример 3 используется с .forEach

let arrWithIndex = [
  [0, 'a'],
  [1, 'b'],
  [2, 'c'],
];

// Not to be confused here, `forEachIndex` is the real index
// `mappedIndex` was created by "another user", so you can't really trust it

arrWithIndex.forEach(([mappedIndex, item], forEachIndex) => {
  console.log(forEachIndex, mappedIndex, item);
});

Пример 7: Is Пример 4 используется с .forEach

let arrWithObjects = [{
    name: 'Jon',
    age: 32
  },
  {
    name: 'Elise',
    age: 33
  }
];
// NOTE: Destructuring objects while using shorthand functions 
// are required to be surrounded by parenthesis
arrWithObjects.forEach( ({ name, age: aliasForAge }) => {
  console.log(name, aliasForAge)
});

Пример 8: Is Пример 5 используется с .forEach

let arrWithObjectsWithArr = [{
    name: 'Jon',
    age: 32,
    tags: ['driver', 'chef', 'jogger']
  },
  {
    name: 'Elise',
    age: 33,
    tags: ['best chef', 'singer', 'dancer']
  }
];

arrWithObjectsWithArr.forEach(({
  name,
  tags: [firstItemFromTags, ...restOfTags]
}) => {
  console.log(name, firstItemFromTags, restOfTags);
});
6 голосов
/ 09 ноября 2017

Наиболее близким к вашей идее было бы использование Array.forEach(), который принимает функцию clojure, которая будет выполняться для каждого элемента массива.

myArray.forEach(
  (item) => {
    // do something 
    console.log(item);
  }
);

Другим жизнеспособным способом было бы использовать Array.map(), который работает таким же образом, но также mutates каждый элемент и возвращает его как:

var myArray = [1, 2, 3];
myArray = myArray.map(
  (item) => {
    return item + 1;
  }
);

console.log(myArray); // [2, 3, 4]
5 голосов
/ 11 ноября 2017

Лямбда-синтаксис обычно не работает в IE 10 или ниже.

Я обычно использую

[].forEach.call(arrayName,function(value,index){
    console.log("value of the looped element" + value);
    console.log("index of the looped element" + index);
});


If you are a jQuery Fan and already have a jQuery file running, you should reverse the positions of the index and value parameters

$("#ul>li").each(function(**index,value**){
    console.log("value of the looped element" + value);
    console.log("index of the looped element" + index);
});
4 голосов
/ 08 марта 2019

, если вы хотите перебрать массив объектов с помощью функции стрелки:

let arr=[{name:'john',age:50},{name:'clark',age:19},{name:'mohan',age:26}];

arr.forEach((person)=>{
  console.log('i am '+person.name+' and i am '+person.age+ ' old');
})
4 голосов
/ 17 июля 2018

Вы можете вызвать forEach. Вот так:

let Array = [1,3,2];

theArray.forEach((element)=>{ 
  // use the element of the array
  console.log(element) 
}

элемент будет иметь значение каждого индекса от 0 до длины массива.

Объяснение:

forEach находится в классе прототипа.Вы также можете вызвать это как theArray.prototype.forEach (...);

прототип: https://hackernoon.com/prototypes-in-javascript-5bba2990e04b

Вы также можете изменить массив следующим образом:

2 голосов
/ 08 сентября 2018

Резюме:

При итерации по массиву нам часто может потребоваться выполнить одну из следующих целей:

  1. Мы хотим перебрать массив и создать новыймассив:

    Array.prototype.map

  2. Мы хотим перебрать массив и не создавать новый массив:

    Array.prototype.forEach

    for..of loop

В JS есть много способов достижения обеих этих целей.Однако некоторые из них более удобны, чем другие.Ниже вы можете найти некоторые часто используемые методы (наиболее удобный imo) для выполнения итерации массива в javascript.

Создание нового массива: Map

map() - это функция, расположенная в Array.prototype который может преобразовать каждый элемент массива, а затем возвращает новый массив.map() принимает в качестве аргумента функцию обратного вызова и работает следующим образом:

let arr = [1, 2, 3, 4, 5];

let newArr = arr.map((element, index, array) => {
  return element * 2;
})

console.log(arr);
console.log(newArr);

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

Отличительная разница между map и другими механизмами цикла, такими как forEach и циклом for..of, заключается в том, чтоmap возвращается как новый массив и оставляет старый массив нетронутым (за исключением случаев, когда вы манипулируете его простотой, думая как splice).

Также обратите внимание, что обратный вызов функции map предоставляет в качестве второго аргумента порядковый номер текущей итерации.Кроме того, третий аргумент предоставляет массив, для которого был вызван map.Иногда эти свойства могут быть очень полезны.

Цикл с использованием forEach

forEach - это функция, расположенная на Array.prototype, которая принимает функцию обратного вызова в качестве аргумента.Затем он выполняет эту функцию обратного вызова для каждого элемента в массиве.В отличие от функции map(), функция forEach ничего не возвращает (undefined).Например:

let arr = [1, 2, 3, 4, 5];

arr.forEach((element, index, array) => {

  console.log(element * 2);

  if (index === 4) {
    console.log(array)
  }
  // index, and oldArray are provided as 2nd and 3th argument by the callback

})

console.log(arr);

Как и функция map, обратный вызов forEach предоставляет в качестве второго аргумента порядковый номер текущей итерации.Также третий аргумент предоставляет массив, для которого был вызван forEach.

Циклический просмотр элементов с использованием for..of

Цикл for..of проходит через каждый элемент массива (или любой другой итерируемый объект).Это работает следующим образом:

let arr = [1, 2, 3, 4, 5];

for(let element of arr) {
  console.log(element * 2);
}

В приведенном выше примере element обозначает элемент массива, а arr - массив, который мы хотим зациклить.Не то чтобы имя element было произвольным, и мы могли бы выбрать любое другое имя, например «el», или что-то более декларативное, когда это применимо.

Не путайте цикл for..in с циклом for..of.for..in будет перебирать все перечисляемые свойства массива, тогда как цикл for..of будет перебирать только элементы массива.Например:

let arr = [1, 2, 3, 4, 5];

arr.foo = 'foo';

for(let element of arr) {
  console.log(element);
}

for(let element in arr) {
  console.log(element);
}
1 голос
/ 02 февраля 2019

Если вы хотите сохранить функциональность своего кода, используйте map:

theArray.map(instance => do_something);

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

1 голос
/ 21 января 2019

// Looping through arrays using foreach  ES6 way

var data = new Array(1,2,3,4,5);
data.forEach((val,index) => {
    console.log("index :",index); // index
	console.log("value :", val); // value
});
1 голос
/ 06 июля 2018

Если у вас есть массивный массив, вы должны использовать iterators, чтобы получить некоторую эффективность. Итераторы являются свойством некоторых коллекций JavaScript (например, Map, Set, String, Array) , Четный, for..of использует iterator под капотом.

Итераторы повышают эффективность, позволяя вам использовать элементы списка по одному, как если бы они были потоком. Что делает итератор особенным, так это то, как он пересекает коллекцию. Другие циклы должны загружать всю коллекцию заранее, чтобы выполнить итерацию по ней, тогда как итератору нужно знать только текущую позицию в коллекции.

Вы получаете доступ к текущему элементу, вызывая метод итератора next. Следующий метод вернет value текущего элемента и boolean, чтобы указать, когда вы достигли конца коллекции. Ниже приведен пример создания итератора из массива.

Преобразуйте ваш обычный массив в итератор, используя метод values() следующим образом:

    const myArr = [2,3,4]

let it = myArr.values();

console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

Вы также можете преобразовать свой обычный массив в итератор, используя Symbol.iterator следующим образом:

const myArr = [2,3,4]

let it = myArr[Symbol.iterator]();

console.log(it.next());
console.log(it.next());
console.log(it.next());
console.log(it.next());

Вы также можете преобразовать свой обычный array в iterator следующим образом:

let myArr = [8, 10, 12];

function makeIterator(array) {
    var nextIndex = 0;
    
    return {
       next: function() {
           return nextIndex < array.length ?
               {value: array[nextIndex++], done: false} :
               {done: true};
       }
    };
};

var it = makeIterator(myArr);

console.log(it.next().value);   // {value: 8, done: false}
console.log(it.next().value);   // {value: 10, done: false}
console.log(it.next().value);   // {value: 12, done: false}
console.log(it.next().value);   // {value: undefined, done: true}

ПРИМЕЧАНИЕ :

  • Итераторы носят исчерпывающий характер.
  • Объекты не являются iterable по умолчанию. В этом случае используйте for..in, потому что вместо значений он работает с ключами.

Подробнее о iteration protocol можно прочитать здесь .

1 голос
/ 30 мая 2018

Если вы хотите использовать forEach(), он будет выглядеть так -

theArray.forEach ( element => {
    console.log(element);
});

Если вы хотите использовать for(), он будет выглядеть так:

...