Это моя заметка о методах массивов в JavaScript, чтобы я мог выбирать подходящие методы в зависимости от каждой ситуации.

Я хотел бы объяснить на основе диаграммы ниже. Я разделил эти методы на семь групп: 1) изменить исходный массив, 2) вернуть новый массив, 3) вернуть часть массива, 4) вернуть логическое значение, 5) преобразовать в строку, 6) преобразовать в значение и 7) циклический массив без возврата нового массива.

Примечание: я выбрал красный цвет для группы 1, потому что изменение исходного массива иногда приводит к неприятным ошибкам в процессе разработки. Точно так же я выбрал желтый цвет для метода .forEach, потому что есть некоторые подводные камни, о которых нам нужно знать.

Группа 1) Мутировать исходный массив

Имя метода: .push, .unshift, .pop, .shift, .splice, .reverse, .sort, .fill

Добавить и удалить

добавить в конце: .push

let arr = [1, 2, 3, 4, 5]
arr.push(6)
console.log(arr) // [ 1, 2, 3, 4, 5, 6 ]

добавить в начале: .unshift

arr.unshift(0)
console.log(arr) // [ 0, 1, 2, 3, 4, 5, 6 ]

удалить в конце (и вернуть удаленное значение): .pop

console.log(arr) // [ 0, 1, 2, 3, 4, 5, 6 ]
let deleted = arr.pop()
console.log(arr) // [ 0, 1, 2, 3, 4, 5 ]
console.log(deleted) // 6

удалить при запуске (и вернуть удаленное значение): .shift

console.log(arr) // [ 0, 1, 2, 3, 4, 5]
deleted = arr.shift()
console.log(arr) // [ 1, 2, 3, 4, 5 ]
console.log(deleted) // 0

Другие изменяемые операции

изменить содержимое: .splice:

Этот метод изменяет содержимое массива, удаляя или заменяя существующие элементы и/или добавляя новые элементы на место (и возвращая массив, содержащий удаленные элементы).

// syntax 
/*
 * @param {integer} start - The index at which to start changing the array.
 * @param {integer} [deleteCount] - An integer indicating the number of elements in the array to remove from start.
 * @param {...elements} [item] - The elements to add to the array, beginning from start.
**/
// !! data type is not actual JavaScript data type !!
splice(start) 
splice(start, deleteCount)
splice(start, deleteCount, item1)
splice(start, deleteCount, item1, item2, itemN)
// examples
console.log(arr) // [ 0, 1, 2, 3, 4, 5, 6 ]
deleted = arr.splice(5)
console.log(arr) //  [ 0, 1, 2, 3, 4 ]
console.log(deleted) // [5,6]
deleted = arr.splice(0,2)
console.log(arr) // [ 2, 3, 4 ]
console.log(deleted) // [ 0, 1 ]
deleted = arr.splice(0,1,100)
console.log(arr) // [ 100, 3, 4 ]
console.log(deleted) // [ 2 ]
deleted = arr.splice(1, 2, 101, 102, 103, 104)
console.log(arr) // [ 100, 101, 102, 103, 104 ]
console.log(deleted) // [ 3, 4 ]

Если вам просто нужна часть массива, рассмотрите возможность использования вместо этого .slice.



обратный массив: .reverse

console.log(arr) // [ 100, 101, 102, 103, 104 ]
arr.reverse()
console.log(arr) //[ 104, 103, 102, 101, 100 ]

сортировать массив: .sort

По умолчанию выполняется восхождение и преобразование в строку, а затем сравнение их последовательностей значений кодовых единиц UTF-16.

let arr = [1, 2, 10, 20, 100, 200]
// default 
arr.sort()
console.log(arr) //[ 1, 10, 100, 2, 20, 200 ]
// ascending order
arr.sort((a, b)=> a-b)
console.log(arr) // [ 1, 2, 10, 20, 100, 200 ]
// descending order
arr.sort((a,b)=>b-a)
console.l0g(arr)


заполнить определенным значением: .fill

Этот метод изменяет все элементы в массиве на статическое значение с начального индекса (по умолчанию 0) на конечный индекс (по умолчанию array.length).

// syntax
/*
 * @param {element} start - Value to fill the array with.
 * @param {integer} [start] - Start index (inclusive), default 0.
 * @param {integer} [end] - End index (exclusive), default arr.length.
**/
// !! data type is not actual JavaScript data type !!
fill(value)
fill(value, start)
fill(value, start, end)
console.log(arr) // [ 200, 100, 20, 10, 2, 1 ]
arr.fill(0)
console.log(arr) // [ 0, 0, 0, 0, 0, 0 ]
arr.fill(1, 1)
console.log(arr) // [ 0, 1, 1, 1, 1, 1 ]
arr.fill(2,2,4)
console.log(arr) // [ 0, 1, 2, 2, 1, 1 ]

Группа 2) Возвращает новый массив

массив цикла и вычислить из исходного массива: .map

// an example
console.log(arr) // [ 100, 101, 102, 103, 104 ]
const newArr = arr.map(element=>element + 1)
console.log(newArr) // [ 101, 102, 103, 104, 105 ]
console.log(arr) // [ 100, 101, 102, 103, 104 ] 

фильтровать по условию: .filter

console.log(arr) // [ 0, 1, 2, 2, 1, 1 ]
let newArr = arr.filter(element=>element === 1)
console.log(newArr) // [ 1, 1, 1 ]

часть оригинала: .slice

// syntax
/*
 * @param {integer} [start] - Zero-based index at which to start extraction.
 * @param {integer} [end] - Zero-based index before which to end extraction.
**/
// !! data type is not actual JavaScript data type !!
slice()
slice(start)
slice(start, end)
// examples
let arr = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
newArr = arr.slice()
console.log(newArr) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
console.log(arr) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
newArr = arr.slice(2)
console.log(newArr) // [ 3, 4, 5, 6, 7, 8, 9, 10 ]
console.log(arr) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
newArr = arr.slice(3, 6)
console.log(newArr) // [ 4, 5, 6 ]


добавление оригинала к другому: .concat

// an example 
console.log(arr) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
console.log(newArr) // [ 4, 5, 6 ]
let concat = arr.concat(newArr)
console.log(concat) // [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 4, 5, 6 ]

сведение оригинала

просто лестный массив: .flat

// syntax
/*
 * @param {integer} [start] - The depth level specifying how deep a nested array structure should be flattened. Defaults to 1.
**/
flat()
flat(depth)
// examples
arr = [1,[2,3],[[4,5]]]
newArr = arr.flat()
console.log(newArr) // [ 1, 2, 3, [ 4, 5 ] ]
newArr = arr.flat(2)
console.log(newArr) // [ 1, 2, 3, 4, 5 ]
arr = [1, [2,3], [[4,5]], [[[6,7]]]]
newArr = arr.flat(Infinity) // [ 1, 2, 3, 4, 5, 6, 7 

с перебором каждого элемента и выравниванием массива до глубины 1: .flatMap

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

// examples
let arr = [1,2,3,4,5]
let arr2 = ["a", "b", "c", "d", "e"]
const flatMapArr = arr.flatMap(x=>[x ** 2])
console.log(flatMapArr) //[ 1, 4, 9, 16, 25 ]
// the difference b/w .map
const mapArr = arr.map(x => [x ** 2]);
console.log(mapArr) // [ [ 1 ], [ 4 ], [ 9 ], [ 16 ], [ 25 ] ]
const flatMapArr2 = arr.flatMap((x, index) => [x, arr2[index]]);
console.log(flatMapArr2) // [ 1, 'a', 2, 'b', 3, 'c', 4, 'd', 5, 'e' ]


Группа 3) вернуть часть массива

вернуть индекс массива

на основе значения: .indexOf

Этот метод возвращает первый соответствующий элемент индекса на основе индекса массива.

// examples
let arr = [1,2,3,4,5]
let indexOfValue1 = arr.indexOf(1)
console.log(indexOfValue1) // 0
arr = [1,2,3,2,1]
indexOfValue1 = arr.indexOf(1)
console.log(indexOfValue1) // 0
const indexOfValue6 = arr.indexOf(6)
console.log(indexOfValue6) // -1 return -1 if it doesn't exist

на основе тестового условия: .findIndex

Этот метод возвращает первый элемент совпадения индекса на основе условия проверки.

// example
let arr = [1,2,3,2,1]
const isEven = (element)=>element%2 === 0
const indexIsEven = arr.findIndex(isEven)
console.log(indexIsEven) // 1

вернуть элемент: .find

Этот метод возвращает первый элемент соответствия на основе условия проверки.

// example
let arr = [1,2,3,4,5,6]
const isEven = (element)=>element%2 === 0
const elementIsEven = arr.find(isEven)
console.log(elementIsEven) // 2

Группа 4) возвращает логическое значение

на основе значения: .includes

Этот метод возвращает true, если массив включает заданное значение, и возвращает false, если нет.

// examples
const isOne = arr.includes(1)
console.log(isOne) // true
const isSeven = arr.includes(7)
console.log(isSeven) // false

на основе тестового условия

чтобы знать, что хотя бы один элемент соответствует условию: .some

// examples
let arr = [1,2,3,4,5,6]
let isArrayHasEven = arr.some(isEven)
console.log(isArrayHasEven) // true
arr = [1,3,5,7,9]
isArrayHasEven = arr.some(isEven)
console.log(isArrayHasEven) // false

чтобы знать, что все элементы соответствуют условию: .every

// examples
let allElementsAreEven = arr.every(isEven)
console.log("1",allElementsAreEven) // false
arr = [2, 4, 6, 8, 10, 12]
allElementsAreEven = arr.every(isEven)
console.log(allElementsAreEven) // true

Группа 5) преобразовать в строку

.присоединиться

// examples
let arr = [2, 4, 6, 8, 10, 12]
let joinedArray = arr.join('')
console.log(joinedArray) // '24681012'
joinedArray = arr.join('😋')
console.log(joinedArray) // '2😋4😋6😋8😋10😋12'

Группа 6) преобразование в значение

.уменьшить

Метод reduce() выполняет предоставленную пользователем функцию обратного вызова 'reducer' для каждого элемента массива по порядку, передавая возвращаемое значение из вычисления предыдущего элемента. Конечным результатом выполнения редуктора для всех элементов массива является одно значение.

// examples
let arr = [1,2,3,4,5]
let sum = arr.reduce((prev, curr)=>prev + curr)
console.log(sum) // 15
// set initvalue: 6
sum = arr.reduce((prev, curr)=>prev + curr, 6)
console.log(sum) // 21
arr = [1,1,2,3,3,4,4,5]
let noDupulications = arr.reduce((prev, curr)=>{
  if(prev.indexOf(curr)===-1){
    prev.push(curr)
  }
  return prev
},[])
console.log(noDupulications) // [ 1, 2, 3, 4, 5 ]


Группа 7) циклический массив без возврата нового массива

.forEach

Этот метод выполняет предоставленную функцию один раз для каждого элемента массива.

let arr = [1,2,3,4,5]
arr.forEach(element=> console.log(element))
// 1
// 2
// 3
// 4
// 5
// equivalent operation with for of
for (let element of arr){
  console.log(element)
}

forEach не ждет обещаний.

let arr = [1,2,3,4,5]
let multiply = 1
const multiplyAsync = async (a, b) => a*b
const multiplySync = (a, b) => a*b
// async? 
arr.forEach(async(element)=>{
  multiply = await multiplyAsync(multiply, element)
})
console.log("after async?",multiply) //1
// sync
multiply = 1
arr.forEach(element=>{
  multiply = multiplySync(multiply, element)
})
console.log("sync",multiply) // 120

forEach() не делает копию массива перед итерацией.

let arr = [1,2,3,4,5]
arr.forEach(element=>{
  console.log(element)
  if(element === 3){
    arr.shift()
  }
})
// 1
// 2
// 3
// 5 <- got one earlier index (3) because 1 was removed
console.log(arr) // [ 2, 3, 4, 5 ]


Спасибо за чтение :)