Напишите функцию, фильтрующую массив объектов по значению свойства JS
Я учусь JS. Короче в одном из скаченных курсов есть задания. И вот там такое задание:
Цель задания Попрактиковаться в использовании сложных структур данных (массив объектов) и работе со свойствами. Задание Напишите функцию, фильтрующую массив объектов по значению свойства. Массив, название свойства и нужное значение должны передаваться в качестве аргументов. Пример использования:
let objects = [
{ name: 'Василий', surname: 'Васильев' },
{ name: 'Иван', surname: 'Иванов' },
{ name: 'Пётр', surname: 'Петров' }
]
// fn - функция, которую нужно написать (хорошее название тоже нужно придумать)
let result = fn(objects, 'name', 'Иван');
/* Результат выполнения должен быть:
[
{ name: 'Иван', surname: 'Иванов' }
]
*/ В конце файла с кодом домашнего задания напишите конструкцию export default {название функции}, чтобы была возможность автоматической проверки получившейся функции.
Рекомендации к выполнению Не забывайте о том, что массивы и объекты передаются по ссылке. Поэтому для формирования массива-результата нужно создать новый отдельный массив, а не изменять старый, который пришёл в качестве параметра.
let objects = [
{ name: 'Василий',
surname: 'Васильев' },
{ name: 'Иван',
surname: 'Иванов' },
{ name: 'Пётр',
surname: 'Петров' }
]
function filterObjValues(objects, key, value) { //функция с 3мя атрибутами
for (i=1; i <= objects.length; ++i) { //цикл от 1 до 3 (так как длина массива обжектс 3)
let obj = Object.values(objects[i]); //переменная в которую кладу значения обжекста name Виселек surname Висилеков name Иван name Иванов и тд
let objKeys = Object.keys(obj); // Переменная в которую кладу только названия значений из прошлой переменной. name, surname
let [keys1, keys2] = objKeys; //деструктаризирую (вот это слово). теперь name находится в keys1 а surname в keys2
let [name, surname] = obj; //деструктаризирую. теперь Василек находится в name, а Васильков в surname.
if (key === keys1 && value === name) { // условие если атрибут 'name' равен keys1 и 'Иван' равен name, То выполнить следующую строчку
let result = `${keys1}:${name} ${keys2}:${surname}`; //переменная = name:Иван surname:Иванов.
console.log(result); //выводим это в консоль.
}
}
}
filterObjValues(objects, 'name', 'Иван'); //запускаем функцию
Если можно подскажите куда я не правильно завернул? ничего не работает =) Пока прошел (функции, циклы, деструктаризацию, условия, массивы и объекты), поэтому задание рассчитано максимум на это. Сердешко вам <3
Ответы (4 шт):
Вы переусложнили и кое-где свернули не туда) Вот возможный вариант с комментариями:
let objects = [
{ name: 'Василий',
surname: 'Васильев' },
{ name: 'Иван',
surname: 'Иванов' },
{ name: 'Пётр',
surname: 'Петров' }
];
function filterObjValues(objects, key, value) {
// Нам нужно вернуть новый массив, так что создадим его.
const result = [];
// Индексы начинаются с 0. Переменную счётчика лучше объявлять с let.
// Длина всегда больше последнего индекса, так что он должен быть меньше длины.
for (let i = 0; i < objects.length; i++) {
// получаем объект по индексу
const obj = objects[i];
// Если значение по key совпадает с value, добавляем объект в массив.
if (obj[key] === value) result.push(obj);
}
// Из функции лучше возвращать значение, а выводить его уже вне функции.
// Особенно если где-то будет проверятся работа функции и её результат.
return result;
}
const filteredArray = filterObjValues(objects, 'name', 'Иван'); // Получаем значение.
console.log(filteredArray); // Выводим результат.
Так же я вам советую, когда что-то идёт не так, добавлять console.log() для каждой вашей переменной, чтобы проверять, всегда ли вы получаете то, что имеете в виду. Например, тут вы получаете не то, что хотите:
let obj = Object.values(objects[i]);
console.log(obj);
let objKeys = Object.keys(obj);
console.log(objKeys);
let objects = [
{ name: 'Василий', surname: 'Васильев' },
{ name: 'Иван', surname: 'Иванов' },
{ name: 'Пётр', surname: 'Петров' }
]
function filter(objects, key, value) {
let result = [];
for(let i = 0; i < objects.length; ++i) {
if(Object.keys(objects[i]).includes(key) == true &&
Object.values(objects[i]).includes(value) == true) {
result.push(objects[i]);
}
}
return result;
}
filter(objects);
let arries = [
{ name: 'Василий', surname: 'Васильев' },
{ name: 'Иван', surname: 'Иванов' },
{ name: 'Пётр', surname: 'Петров' }
]
function filter(objects, key, value) {
let newObjects = [];
for (let object of objects) {
if (object[key] === value) {
newObjects.push(object);
console.log(newObjects);
}
}
return newObjects;
}
filter(arries, 'surname', 'Васильев');
const usersList = [{
name: 'Петр',
surname: 'Сидоров'
},
{
name: 'Иван',
surname: 'Петров'
},
{
name: 'Илья',
surname: 'Яблокин'
},
{
name: 'Никита',
surname: 'Иванов'
},
{
name: 'Альберт',
surname: 'Ильин'
},
{
name: 'Иосиф',
surname: 'Сталин'
},
{
name: 'Владимир',
surname: 'Ленин'
},
{
name: 'Александр',
surname: 'Пушкин'
},
{
name: 'Иван',
surname: 'Николаев'
},
{
name: 'Марина',
surname: 'Серьгина'
},
{
name: 'Ирина',
surname: 'Круг'
},
{
name: 'Анна',
surname: 'Кошкина'
}
]
const dataFilter = (arrayChecked, elementProperty, desiredValue) => {
const userSerch = arrayChecked.filter(item => item[elementProperty] === desiredValue)
return userSerch
}
console.log(dataFilter(usersList, 'name', 'Иван'))