Сложные методы массива Flashcards
Методы массивов, slice, splice, toSpliced, reduce
Мутабельный - массив изменяется.
Иммутабельный - массив остается прежним.
slice - иммутабельный, помогает вырезать часть массива и возвратить часть, которого вы вырезали. При этом исходный массив не изменится. Для копирования массива.
Первый элемент - откуда начнем вырезать
Второй - номер элемента, где закончится вырезание (вырезает не включительно, а до какого-то элемента, см. пример)
Он также может принимать отрицательные значения. В этом случае отсчет элемента, на котором закончится обрезание, начинается с конца массива. Последний элемент при этом будет иметь номер -1.
arr.slice(откуда отрезать, (докуда отрезать)) - второй параметр - необязательный.
Пример:
//1 Вырезаем
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
let subArr = arr.slice(0, 2) // второй параметр не вкл. вырезает элементы.
console.log(‘arr: ‘, arr) // arr: [ ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ ]
console.log(‘subArr: ‘, subArr) // subArr: [ ‘a’, ‘b’ ]
//2 Копируем
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
let subArr = arr.slice();
console.log(‘subArr: ‘, subArr) //subArr: [ ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ ]
console.log(arr === subArr) // false
//3 Используем только первый параметр
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
let subArr = arr.slice(2)
console.log(‘subArr ‘, subArr) //subArr [ ‘c’, ‘d’, ‘e’ ]
splice - мутабельный метод массива
arr.splice(откуда удаляем, сколько удаляем, вставить, вставить)
splice() - удаляет или добавляет элементы в массив. Можно только удалять элементы, только добавлять или делать и то и другое одновременно.
Метод изменяет сам массив и возвращает при этом массив удаленных элементов.
Первым параметром метод принимает номер элемента массива, который нужно удалить. Вторым параметром - сколько элементов массива следует удалить. Если его поставить в 0 - то элементы удалены не будут (только добавлены новые). Дальше через запятую идут элементы, которые нужно добавить в массив (являются необязательными параметрами). Эти элементы добавятся вместо удаленных элементов массива.
Если удаления не было (когда второй параметр 0) - элементы вставляются в массив начиная с той позиции, которая указана первым параметром метода. Первый параметр может иметь отрицательное значение. В этом случае отсчет позиции начнется не с начала массива, а с конца. Последний элемент при этом будет иметь номер -1.
//1 Удаление
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
let subArr = arr.splice(1, 3)
console.log(‘arr: ‘, arr) // arr: [‘a’, ‘e’]
console.log(‘subArr:’, subArr) //subArr: [ ‘b’, ‘c’, ‘d’ ]
//2 Добавление
let arr = [‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
let subArr = arr.splice(0, 0, ‘value1’, ‘value2’)
console.log(‘arr: ‘, arr) //arr: [ ‘value1’, ‘value2’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’ ]
console.log(‘subArr: ‘, subArr) //subArr: []
//3 Если очистить массив и добавить новое значение
let arR = [1, 2, 4];
let test = ‘Value’
let arrLength = arR.length;
arR.splice(0, arrLength, test)
console.log(‘arr:’, arR) //arr: [ ‘Value’ ]
toSpliced() -иммутабельный метод массива, передаются точно также как и в сплайсе.
const months = [‘Jan’, ‘Mar’, ‘Apr’, ‘May’]
const newM = months.toSpliced(1, 0, ‘Feb’)
console.log(‘init month:’, months) //[‘Jan’, ‘Mar’, ‘Apr’, ‘May’]
console.log(‘new Months: ‘, newM) //[‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’]
Если хотим удалить последний элемент, то передаем -1, если ничего то 0.
reduce() - аккумилирующие значение, когда нам нужно сделать и прийти к одному решению, представляет колбэк, который принимает в себя акк (предыдущее значение), элемент по которому мы получаем, в ходе каждой иттерации и получаем индекс.
let a = [1,2,3,4,5]
let sum = 0;
for (let i = 0; i<a.length; i++){
sum = sum + a[i];
}
console.log(sum) //15
reduce - это метод, который позволяет применять функцию к массиву, причем применяет ее следующим образом. Функция коллбэк у нас имеет несколько параметров это prev предыдущее или правильнее сказать вычисляемой значение, item и необязательный это index номер элемента в массиве
prev - это вычисляемое значение. Чему оно равно до старта? до старта оно равняется нулевому элементу массива (arr[0]), если мы не укажем сами, т..е в первый момент времени, в первом круге перебору равен нулевому элемента массива, либо мы можем указать через запятую чему будет на старте равно наше вычисляемое значение
В начальный момент сумма равна 0, как мы видим из предыдущего примера, поэтому я через запятую указываю, что наш prev на первом кругу будет равен 0.
Что я должна делать внутри функции(коллбэке), раз prev вычисляемое значение, то я должна написать return и возвратить вычисляемое значение prev + item (элемент текущего массива)
reduce (function(acc, item, index) {}, []) //[] - указали начальное значение
reduce (function(acc, item, index) {} ) //без начального значения, то стартовое значение будет равно acc[0], т.е. первое значение начального массива
Функция обратного вызова принимает два аргумента: acc - аккумулированное максимальное значение и current - текущий элемент массива. Если текущий элемент больше аккумулированного максимального значения, то он становится новым максимальным значением.
let a = [1,2,3,4,5]
let res = a.reduce(function (acc,item){
return acc + item
}, 0)
console.log(‘res: ‘,res) //15
const fruits = [
{name: ‘apple’, quanity: 2},
{name: ‘banana’, quanity: 3},
{name: ‘orange’, quanity: 1},
];
const totalQuantity = fruits.reduce(function(prev, fruit){
return prev + fruit.quanity
}, 0)
console.log(totalQuantity) //6
//найти наиб и наим зн-е
const num = [5,6,7,10,6,7]
const maxNum = num.reduce(function (acc, currentNum){
console.log(‘currentNum: ‘, currentNum)
console.log(‘acc: ‘, acc)
return currentNum > acc ? currentNum : acc;
}, num[1])
console.log(maxNum)
// объединили в массив имена и посчитали возраст
const result = people.reduce(
function (acc, user){
acc.names.push(user.name);
acc.totalAge += user.age;
return acc;
},
{names: [], totalAge: 0}
)
console.log(result) //{ names: [ ‘Alice’, ‘Bob’, ‘Charlie’ ], totalAge: 75 }
//со строкой
const words = [‘Hello’, ‘ ‘, ‘world’, ‘!’] //Hello world!
const resu = words.reduce((acc, el) => {
return acc + el;
}, ‘ ‘)
console.log(resu) // Hello world!
//минимальное значение
const arrr = [1, 20, 30, 60, 7, 0] //min
const minNum = arrr.reduce((acc, el) =>{
return el < acc ? el : acc
})
console.log(minNum) //0