Как вытащить массив с выборочными св-ми через деструктурирующее присваивание в JS?
Как записать массив 'users' в переменную из объекта, с выборочными св-ми через деструктурирующее присваивание в JS?
Например с св-ми id и poor (пример объекта ниже)
P.S. Элементов у users может быть больше 2
// Пример объекта
const testArr = {
title: "test",
users: [
{
id: 1,
poor: false,
sex: "man"
},
{
id: 2,
poor: true,
sex: "woman"
}
]
}
// Нужный результат:
let users = [
{
id: 1,
poor: false
},
{
id: 2,
poor: true
}
]
Ответы (4 шт):
Автор решения: Yaant
→ Ссылка
// Пример объекта
const testArr = {
title: "test",
users: [
{
id: 1,
poor: false,
sex: "man"
},
{
id: 2,
poor: true,
sex: "woman"
}
]
}
let { users } = testArr;
users = users.map(({id, poor}) => ({id, poor}));
console.log(users);
Автор решения: DiD
→ Ссылка
Это будет немного коряво. Но деструктурирующим способом лучше не получится.
const testArr = {
title: "test",
users: [
{
id: 1,
poor: false,
sex: "man"
},
{
id: 2,
poor: true,
sex: "woman"
}
]
}
const {users:[{id,poor},{id:id2,poor:poor2}]} = testArr;
const result = [{id,poor},{id:id2,poor:poor2}];
console.log(result);
Автор решения: vp_arth
→ Ссылка
Если говорить только о деструктурировании, то синтаксис такой:
// Пример объекта
const testArr = {
title: "test",
users: [
{id: 1, poor: false, sex: "man"},
{id: 2, poor: true, sex: "woman"}
]
};
const {users: [{sex: _1, ...user1}, {sex: _2, ...user2}]} = testArr;
console.log(JSON.stringify([user1, user2]));
Вы просто биндите ненужные свойства в dummy переменные.
Но для массива это малопрактично, т.к. в ок. 100% случаев длина неизвестна.
лучше просто замаппить нужные данные:
// Пример объекта
const testArr = {
title: "test",
users: [
{id: 1, poor: false, sex: "man"},
{id: 2, poor: true, sex: "woman"}
]
};
{
// Всё, кроме sex
const users = testArr.users.map(user => {const {sex: _, ...u} = user; return u;});
const users0 = testArr.users.map(({sex, ...user}) => user);
console.log(JSON.stringify(users));
console.log(JSON.stringify(users0));
}
{
// Перечисление полей
const users = testArr.users.map(user => {const {id, poor} = user; return {id, poor};});
const users0 = testArr.users.map(({id, poor}) => ({id, poor}));
const users1 = testArr.users.map(user => ({id: user.id, poor: user.poor}));
console.log(JSON.stringify(users));
console.log(JSON.stringify(users0));
console.log(JSON.stringify(users1));
}
Автор решения: Frog Frogov
→ Ссылка
Всем спасибо за ответы!
Понял что деструктуризация не подходит для этих целей, на основе ваших ответов создал свою функцию ( аналогичная кстати есть в lodash (pick) ) :P
// Данные
const testArr = {
title: "test",
users: [
{
id: 1,
poor: false,
sex: "man"
},
{
id: 2,
poor: true,
sex: "woman"
}
]
}
// Достаем users
let { users } = testArr;
// Парсим users
const filterArrToExistProps = (items = [], ...properties) => {
return items.map(item => {
const newObj = {};
properties.forEach(prop => {
item.hasOwnProperty(prop) && (newObj[prop] = item[prop]);
});
return newObj;
});
};
// Выводим
console.log( filterArrToExistProps( users, "id", "poop" ) );
P.S (обновленный ответ).
спасибо @Yaant и остальным:
testArr.users.map(({id, sex}) => ({ id, sex }) )