Помогите решить задачу на JS
Всем привет! Я изучаю js и столкнулся с задачей, которая никак не укладывается в голове. Помогите понять, что я делаю не так? Заранее благодарю)
Условие:
Создать функцию которая принимает массив пользователей, поле на которое хочу проверить и значение на которое хочу проверять. Проверять что все аргументы переданы. Возвращать новый массив с пользователями соответствующие указанным параметрам.
Массив:
users = [
{name: 'Pavel', gender: 'male', age: 29},
{name: 'Anna', gender: 'female', age: 18},
{name: 'Fiona', gender: 'female', age: 19},
{name: 'Julia', gender: 'female', age: 28},
{name: 'Alex', gender: 'male', age: 23},
{name: 'Sonya', gender: 'female', age: 17},
{name: 'Frank', gender: 'male', age: 44},
{name: 'John', gender: 'male', age: 49},
{name: 'Greta', gender: 'female', age: 57}
];
Функция которую я написал:
function funcGetUsers(arrayUsers, key, keyValue) {
let endArray = arrayUsers.slice();
for (let user in endArray) {
if (endArray[user][key] != keyValue) {
endArray.splice(user, 1);
} else {
continue;
}
}
return endArray;
}
Новый массив, которому функция передаст значение:
let newUser = funcGetUsers(users, 'gender', 'female');
console.log(newUser);
Результат, который выводит консоль:
(6) [{…}, {…}, {…}, {…}, {…}, {…}]
0: {name: "Anna", gender: "female", age: 18}
1: {name: "Fiona", gender: "female", age: 19}
2: {name: "Julia", gender: "female", age: 28}
3: {name: "Sonya", gender: "female", age: 17}
4: {name: "John", gender: "male", age: 49}
5: {name: "Greta", gender: "female", age: 57}
length: 6
__proto__: Array(0)
Ответы (2 шт):
Можно сделать так попроще
function funcGetUsers(arrayUsers, key, keyValue) {
return arrayUsers.filter(item => item[key] === keyValue);
}
let users = [
{name: 'Pavel', gender: 'male', age: 29},
{name: 'Anna', gender: 'female', age: 18},
{name: 'Fiona', gender: 'female', age: 19},
{name: 'Julia', gender: 'female', age: 28},
{name: 'Alex', gender: 'male', age: 23},
{name: 'Sonya', gender: 'female', age: 17},
{name: 'Frank', gender: 'male', age: 44},
{name: 'John', gender: 'male', age: 49},
{name: 'Greta', gender: 'female', age: 57}
];
let newUser = funcGetUsers(users, 'gender', 'female');
console.log(newUser);
PS. А ваша проблема вы мутируете массив при этом перебираете его, что не приветствуется.
const users = [
{name: 'Pavel', gender: 'male', age: 29},
{name: 'Anna', gender: 'female', age: 18},
{name: 'Fiona', gender: 'female', age: 19},
{name: 'Julia', gender: 'female', age: 28},
{name: 'Alex', gender: 'male', age: 23},
{name: 'Sonya', gender: 'female', age: 17},
{name: 'Frank', gender: 'male', age: 44},
{name: 'John', gender: 'male', age: 49},
{name: 'Greta', gender: 'female', age: 57}
];
function funcGetUsers(arrayUsers, key, keyValue){
let result = [];
for (let user of arrayUsers) {
if (user[key] === keyValue) {
result.push(user);
}
}
return result;
};
const newUser = funcGetUsers(users, 'gender', 'female');
console.log(newUser);
Выше указали самый быстрый и простой способ, предложу еще свой, который ближе к вашему. Различие заключается в том, что здесь не создается копия массива и потом из нее не вырезаются значения, а наоборот - в пустой итоговый массив добавляются только подходящие:
const users = [
{name: 'Pavel', gender: 'male', age: 29},
{name: 'Anna', gender: 'female', age: 18},
{name: 'Fiona', gender: 'female', age: 19},
{name: 'Julia', gender: 'female', age: 28},
{name: 'Alex', gender: 'male', age: 23},
{name: 'Sonya', gender: 'female', age: 17},
{name: 'Frank', gender: 'male', age: 44},
{name: 'John', gender: 'male', age: 49},
{name: 'Greta', gender: 'female', age: 57}
];
const funcGetUsers = (arrayUsers, key, keyValue) => {
let endArray = [];
for (let user in arrayUsers) {
if (arrayUsers[user][key] === keyValue) {
endArray.push(arrayUsers[user]);
}
}
return endArray;
};
const newUser = funcGetUsers(users, 'gender', 'female');
console.log(newUser);