Функция должна вернуть массив всех значений свойства с одинаковым именем из каждого объекта в массиве
Функция должна вернуть массив всех значений свойства с таким именем из каждого объекта в массиве products. Что то напутал в цикле for. of. Выводится только пустой массив.
const products = [< name: "Radar", price: 1300, quantity: 4 >, < name: "Scanner", price: 2700, quantity: 3 >, < name: "Droid", price: 400, quantity: 7 >, < name: "Grip", price: 1200, quantity: 9 >, ]; function getAllPropValues(propName) < let arrValue = []; for (const product of products) < if (propName === product.propName) < return arrValue.push(propName); >> return arrValue; >
Отслеживать
3,908 4 4 золотых знака 9 9 серебряных знаков 22 22 бронзовых знака
задан 10 июл 2022 в 18:20
Артем Якушкин Артем Якушкин
return arrValue.push(propName); что это?
10 июл 2022 в 18:20
хочу запушить в масиив значения свойств со всех объектов
10 июл 2022 в 18:23
а return зачем?
10 июл 2022 в 18:23
Вывести его из функции
10 июл 2022 в 18:24
а тогда return arrValue; вот это что делает?
10 июл 2022 в 18:24
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Если я всё правильно понял, то вам просто нужно использовать метод map и не нужно никаких проверок:
const products = [< name: "Radar", price: 1300, quantity: 4 >, < name: "Scanner", price: 2700, quantity: 3 >, < name: "Droid", price: 400, quantity: 7 >, < name: "Grip", price: 1200, quantity: 9 >, ]; const getAllPropValues = (propName) => products.map(product => product[propName]); console.log(getAllPropValues('name')); console.log(getAllPropValues('price')); console.log(getAllPropValues('quantity'));
P.S. Если указанного свойства не будет в объекте, то вставится undefined в массив
Array.prototype.slice()
Метод slice() возвращает новый массив, содержащий копию части исходного массива.
Интерактивный пример
Синтаксис
arr.slice([begin[, end]])
Параметры
begin Необязательный
Индекс (счёт начинается с нуля), по которому начинать извлечение.
Если индекс отрицательный, begin указывает смещение от конца последовательности. Вызов slice(-2) извлечёт два последних элемента последовательности.
Если begin не определён, slice() начинает работать с индекса 0 .
Если begin больше длины последовательности вернётся пустой массив.
Индекс (счёт начинается с нуля), по которому заканчивать извлечение. Метод slice() извлекает элементы с индексом меньше end .
Вызов slice(1, 4) извлечёт элементы со второго по четвёртый (элементы по индексам 1, 2 и 3).
Если индекс отрицательный, end указывает смещение от конца последовательности. Вызов slice(2, -1) извлечёт из последовательности элементы начиная с третьего элемента с начала и заканчивая вторым с конца.
Если end опущен, slice() извлекает все элементы до конца последовательности ( arr.length ).
Возвращаемое значение
Новый массив, содержащий извлечённые элементы.
Описание
Метод slice() не изменяет исходный массив, а возвращает новую «одноуровневую» копию, содержащую копии элементов, вырезанных из исходного массива. Элементы исходного массива копируются в новый массив по следующим правилам:
- Ссылки на объекты (но не фактические объекты): метод slice() копирует ссылки на объекты в новый массив. И оригинал, и новый массив ссылаются на один и тот же объект. То есть, если объект по ссылке будет изменён, изменения будут видны и в новом, и в исходном массивах.
- Строки и числа (но не объекты String и Number ): метод slice() копирует значения строк и чисел в новый массив. Изменения строки или числа в одном массиве никак не затрагивает другой.
Если к любому массиву будет добавлен новый элемент, это никак не повлияет на другой массив.
Примеры
Пример: возврат части существующего массива
// Пример: наши хорошие друзья цитрусовые среди фруктов var fruits = ["Банан", "Апельсин", "Лимон", "Яблоко", "Манго"]; var citrus = fruits.slice(1, 3); // citrus содержит ['Апельсин', 'Лимон']
Пример: использование метода slice()
В следующем примере метод slice() создаёт новый массив, newCar , из массива myCar . Оба содержат ссылку на объект myHonda . Когда цвет в объекте myHonda изменяется на багровый, оба массива замечают это изменение.
// Используя slice, создаём newCar из myCar. var myHonda = color: "красный", wheels: 4, engine: cylinders: 4, size: 2.2 >, >; var myCar = [myHonda, 2, "в хорошем состоянии", "приобретена в 1997"]; var newCar = myCar.slice(0, 2); // Отображаем значения myCar, newCar и цвет myHonda // по ссылкам из обоих массивов. console.log("myCar token operator">+ myCar.toSource()); console.log("newCar token operator">+ newCar.toSource()); console.log("myCar[0].color token operator">+ myCar[0].color); console.log("newCar[0].color token operator">+ newCar[0].color); // Изменяем цвет myHonda. myHonda.color = "багровый"; console.log("Новый цвет моей Honda - " + myHonda.color); // Отображаем цвет myHonda по ссылкам из обоих массивов. console.log("myCar[0].color token operator">+ myCar[0].color); console.log("newCar[0].color token operator">+ newCar[0].color);
Этот скрипт выведет:
= [color:'красный', wheels:4, engine:cylinders:4, size:2.2>>, 2, 'в хорошем состоянии', 'приобретена в 1997'] newCar = [color:'красный', wheels:4, engine:cylinders:4, size:2.2>>, 2] myCar[0].color = красный newCar[0].color = красный Новый цвет моей Honda - багровый myCar[0].color = багровый newCar[0].color = багровый
Массивоподобные объекты
Метод slice() также может использоваться для преобразования массивоподобных объектов / коллекций в новый массив Array . Вам просто нужно привязать метод к объекту. Псевдомассив arguments (en-US) внутри функции как раз является примером «массивоподобного объекта».
function list() return Array.prototype.slice.call(arguments, 0); > var list1 = list(1, 2, 3); // [1, 2, 3]
Привязка может быть осуществлена посредством функции call() из прототипа функции Function.prototype (en-US), также запись может быть сокращена до [].slice.call(arguments) вместо использования Array.prototype.slice.call() . В любом случае, она может быть упрощена посредством использования функции bind() .
var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); function list() return slice(arguments, 0); > var list1 = list(1, 2, 3); // [1, 2, 3]
Совершенствование кросс-браузерного поведения
Хотя спецификация не требует от хост-объектов (например, объектов DOM) следовать поведению Mozilla при преобразовании с помощью Array.prototype.slice() и IE < 9 так не делает, версии IE, начиная с 9-й это умеют. «Прокладывание» позволяет добиться надёжного кросс-браузерного поведения. Пока другие современные браузеры будут поддерживать эту способность, что и делают в настоящее время IE, Mozilla, Chrome, Safari и Opera, разработчики, читая (поддерживающий DOM) код функции slice() , опирающийся на эту прокладку, не будут вводиться в заблуждение его семантикой; они могут смело полагаться на текущую семантику, являющуюся, видимо, де-факто стандартным поведением. (Прокладка также исправляет поведение IE, позволяя работать со вторым аргументом slice() , явно определённым как null / undefined , поскольку более ранние версии IE такое не позволяют, но все современные браузеры, в том числе IE >= 9, поддерживают данное поведение.)
/** * Прокладка для "исправления" отсутствия поддержки в IE < 9 применения slice * к хост-объектам вроде NamedNodeMap, NodeList и HTMLCollection * (технически, поскольку хост-объекты зависят от реализации, * по крайней мере, до ES2015, IE не обязан так работать). * Также работает для строк, исправляет поведение IE < 9, позволяя явно указывать undefined * вторым аргументом (как в Firefox), и предотвращает ошибки, возникающие при * вызове на других объектах DOM. */(function () "use strict"; var _slice = Array.prototype.slice; try // Не может использоваться с элементами DOM в IE < 9_slice.call(document.documentElement); > catch (e) // В IE < 9 кидается исключение// Функция будет работать для истинных массивов, массивоподобных объектов, // NamedNodeMap (атрибуты, сущности, примечания), // NodeList (например, getElementsByTagName), HTMLCollection (например, childNodes) // и не будет падать на других объектах DOM (как это происходит на элементах DOM в IE < 9)Array.prototype.slice = function (begin, end) // IE < 9 будет недоволен аргументом end, равным undefinedend = typeof end !== "undefined" ? end : this.length; // Для родных объектов Array мы используем родную функцию slice if (Object.prototype.toString.call(this) === "[object Array]") return _slice.call(this, begin, end); > // Массивоподобные объекты мы обрабатываем самостоятельно var i, cloned = [], size, len = this.length; // Обрабатываем отрицательное значение begin var start = begin || 0; start = start >= 0 ? start : len + start; // Обрабатываем отрицательное значение end var upTo = end ? end : len; if (end 0) upTo = len + end; > // Фактически ожидаемый размер среза size = upTo - start; if (size > 0) cloned = new Array(size); if (this.charAt) for (i = 0; i size; i++) cloned[i] = this.charAt(start + i); > > else for (i = 0; i size; i++) cloned[i] = this[start + i]; > > > return cloned; >; > >)();
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.slice |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.splice()
- Function.prototype.call()
- Function.prototype.bind()
Array.prototype.filter()
Метод filter() создаёт новый массив со всеми элементами, прошедшими проверку, задаваемую в передаваемой функции.
Интерактивный пример
Синтаксис
// Стрелочная функция filter((element) => . > ) filter((element, index) => . > ) filter((element, index, array) => . > ) // Колбэк-функция filter(callbackFn) filter(callbackFn, thisArg) // Встроенная колбэк-функция filter(function callbackFn(element) . >) filter(function callbackFn(element, index) . >) filter(function callbackFn(element, index, array) . >) filter(function callbackFn(element, index, array) . >, thisArg)
Параметры
Функция-предикат, которая будет вызвана для проверки каждого элемента массива. Если функция возвращает true , то элемент остаётся в массиве, если false , то удаляется.
Принимает три аргумента
Текущий обрабатываемый элемент в массиве.
Индекс текущего обрабатываемого элемента в массиве.
Обрабатываемый массив, на котором был вызван метод filter() .
Значение, используемое в качестве this при вызове колбэк-функции callbackFn .
Возвращаемое значение
Вернётся новый массив с элементами, которые прошли проверку. Если ни один элемент не прошёл проверку, то будет возвращён пустой массив.
Описание
Метод filter() вызывает переданную функцию callback один раз для каждого элемента, присутствующего в массиве, и создаёт новый массив со всеми значениями, для которых функция callback вернула значение, которое может быть приведено к true . Функция callback вызывается только для индексов массива с уже определёнными значениями; она не вызывается для индексов, которые были удалены или которым значения никогда не присваивались. Элементы массива, не прошедшие проверку функцией callback , просто пропускаются и не включаются в новый массив.
Функция callback вызывается с тремя аргументами:
- значение элемента;
- индекс элемента;
- массив, по которому осуществляется проход.
Если в метод filter() был передан параметр thisArg , при вызове callback он будет использоваться в качестве значения this . В противном случае в качестве значения this будет использоваться значение undefined . В конечном итоге, значение this , наблюдаемое из функции callback , определяется согласно обычным правилам определения this .
Метод filter() не изменяет массив, для которого он был вызван.
Элементы массива, обрабатываемые методом filter() , устанавливается до первого вызова функции callback . Элементы, добавленные в массив после начала выполнения метода filter() , либо изменённые в процессе выполнения, не будут обработаны функцией callback . Соответствующим образом, если существующие элементы удаляются из массива, они также не будут обработаны
Предупреждение: одновременное изменение элементов, описанное в предыдущем параграфе, часто приводит к труднопонимаемому коду, поэтому не рекомендуется делать это (за исключением особых случаев).
Примеры
Фильтрация всех маленьких значений
Следующий пример использует filter() для создания отфильтрованного массива, все элементы которого больше или равны 10, а все меньшие 10 удалены.
function isBigEnough(value) return value >= 10; > let filtered = [12, 5, 8, 130, 44].filter(isBigEnough); // массив filtered теперь содержит [12, 130, 44]
Найти все простые числа в массиве
Следующий пример возвращает все простые числа в массиве:
const array = [-3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]; function isPrime(num) for (let i = 2; num > i; i++) if (num % i == 0) return false; > > return num > 1; > console.log(array.filter(isPrime)); // [2, 3, 5, 7, 11, 13]
Фильтрация неверных записей в JSON
В следующем примере метод filter() используется для создания отфильтрованного JSON-объекта, все элементы которого содержат ненулевое числовое поле id .
let arr = [ id: 15 >, id: -1 >, id: 0 >, id: 3 >, id: 12.2 >, >, id: null >, id: NaN >, id: "undefined" >, ]; let invalidEntries = 0; function filterByID(item) if (Number.isFinite(item.id) && item.id !== 0) return true; > invalidEntries++; return false; > let arrByID = arr.filter(filterByID); console.log("Отфильтрованный массив\n", arrByID); // Отфильтрованный массив // [< id: 15 >, < id: -1 >, < id: 3 >, < id: 12.2 >] console.log("Количество некорректных элементов token punctuation">, invalidEntries); // Количество некорректных элементов = 5
Поиск в массиве
В следующем примере filter() используется для фильтрации содержимого массива на основе входных данных.
var fruits = ["apple", "banana", "grapes", "mango", "orange"]; /** * Элементы массива фильтруется на основе критериев поиска (query) */ function filterItems(query) return fruits.filter(function (el) return el.toLowerCase().indexOf(query.toLowerCase()) > -1; >); > console.log(filterItems("ap")); // ['apple', 'grapes'] console.log(filterItems("an")); // ['banana', 'mango', 'orange']
Реализация с использованием ES2015
const fruits = ["apple", "banana", "grapes", "mango", "orange"]; /** * Элементы массива фильтруется на основе критериев поиска (query) */ const filterItems = (arr, query) => return arr.filter( (el) => el.toLowerCase().indexOf(query.toLowerCase()) !== -1, ); >; console.log(filterItems(fruits, "ap")); // ['apple', 'grapes'] console.log(filterItems(fruits, "an")); // ['banana', 'mango', 'orange']
Модификация изначального массива (изменение, добавление и удаление)
В следующих примерах проверяется поведение метода filter при изменении массива.
// Изменение всех элементов let words = ["spray", "limit", "exuberant", "destruction", "elite", "present"]; const modifiedWords = words.filter((word, index, arr) => arr[index + 1] += " extra"; return word.length 6; >); console.log(modifiedWords); // Обратите внимание, что есть три слова длиной менее 6, но так как они были изменены, // возвращается одно слово ['spray'] // Добавление новых элементов words = ["spray", "limit", "exuberant", "destruction", "elite", "present"]; const appendedWords = words.filter((word, index, arr) => arr.push("new"); return word.length 6; >); console.log(appendedWords); // Только три слова удовлетворяют условию, хотя `words` теперь имеет куда больше слов, // длинной меньше 6 символов: ['spray', 'limit', 'elite'] // Удаление элементов words = ["spray", "limit", "exuberant", "destruction", "elite", "present"]; const deleteWords = words.filter((word, index, arr) => arr.pop(); return word.length 6; >); console.log(deleteWords); // Заметьте, что 'elite' не получено, так как удалено из `words` до того, // как filter смог получить его: ['spray', 'limit']
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-array.prototype.filter |
Поддержка браузерами
BCD tables only load in the browser
Смотрите также
- Полифил Array.prototype.filter в библиотеке core-js
- Array.prototype.forEach()
- Array.prototype.every()
- Array.prototype.some()
- Array.prototype.reduce()
- Array.prototype.find()
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 4 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Вопрос №79097 от пользователя Alexander Petrov в уроке «Jest», курс «JS: Автоматическое тестирование»
Работа функции without вроде понятна, она создает массив, исключая элементы [values] , перечисленные во втором параметре. Но если с первым тестом все понятно:
первый тест, безусловно, должен быть. Зачем нам второй тест?
При проверке функции мы должны проверить ее основной функционал и поведение в пограничных случаях. Тест, который вы привели:
Это как раз проверка основного варианта работы функции — у нас есть массив и есть элементы, которые мы должны исключить. Вариант работы с пустым массивом является пограничным случаем, его мы тоже должны проверить. Как считаете, что должна вернуть функция, если ей передать пустой массив?
Maksim Litvinov, при передаче в функцию пустого массива возвращается пустой массив. Возможно, я не внимательно читал, что есть такие пограничные случаи. Или не учел. Не додумался бы самостоятельно. Спасибо!