#javascript
Вопрос:
Я хочу получить все истинные значения из массива объектов:
const users = [{
name: 'string',
val: false,
},
{
name: true,
val: [],
}
]
const identifiers = users.map(i => Object.entries(i))
const active = identifiers.filter(function(id) {
const t = id.map((i, k) => id[k][1])
return t
})
console.log(active)
Идея кода выше в конце, чтобы использовать Object.fromEntries()
и получить что-то вроде этого:
const users = [{
name: 'string,
},
{
name: true,
}
]
На данный момент я заблокирован и не могу получить ожидаемые значения. Кто может помочь получить ожидаемый результат?
Комментарии:
1. какое-то последовательное понижение здесь, не знаю почему.
Ответ №1:
Вы можете использовать reduce
метод с Object.entries
и Object.fromEntries
let result = users.reduce((acc,i) => {
let obj = Object.entries(i).filter(([k,v]) => v);
acc.push(Object.fromEntries(obj));
return acc;
}, [])
console.log(result);
Комментарии:
1. гу ответ, но не могли бы вы взглянуть сейчас, я обновил вопрос.
2. @Спрашивает
users = [{ name: 'string', val: false, }, { name: true, val: [], }, { name: false, val: true, } ]
, каким должен быть ожидаемый результат для этого ввода?3. я добавил в вопрос
4. @Спрашиваю, пожалуйста, проверьте этот пример
users = [{ name: 'string', val: false, }, { name: true, val: [], }, { name: false, val: true, } ] what should be the expected output for this input?
. В своем вопросе вы упомянули другой пример.
Ответ №2:
Вы можете использовать Object.fromEntries
для создания объекта только те свойства, которые соответствуют действительности:
const users = [{
name: true,
val: false,
},
{
name: true,
val: true,
}
]
const identifiers = users.map(e => { // Map User array
return Object.fromEntries( // return new object for every element
Object.entries(e).filter((o) => o[1] === true) // object constructed using just truthy values by filtering object o[1] -> value
)
});
console.log(identifiers)
Или красивый лайнер:
const identifiers = users.map(e => Object.fromEntries(Object.entries(e).filter(([_,o]) => o)));
Комментарии:
1. как сделать, если мой массив будет выглядеть следующим образом: пользователи const = [{ имя: истина, значение: ложь,}, {имя: истина, значение: [],}], чтобы получить что-то вроде этого: пользователи const = [{ имя: истина, }, { имя: истина, } ]?
2. @Вопрос: пожалуйста, обновите свой первоначальный вопрос соответствующим образом. Массив, даже пустой, обычно считается «правдивым».
3.
!![] == true
, например!!true == true
, или!!"test" == true
используйте проверку типа в фильтре, как я сделалo[1] === true
, чтобы получить не все истинные значения, а все логические значения, которые точно равны истине!
Ответ №3:
Это должно сработать:
const newData = users.map(user => {
return Object.keys(user).reduce((obj, key) => {
if (user[key]) { //for strict truthy, make user[key] === true
obj[key] = user[key];
}
return obj;
} ,{});
});
Это будет:
- Выполните операцию фильтрации объектов для каждого элемента массива (карты).
- Выполните итерацию по каждому ключу объекта (Объект.ключи(пользователь).уменьшить)
- Добавьте пару значений ключа только в том случае, если значение соответствует действительности.
Обратите внимание, что это вернет новую структуру, а не изменит существующую. Я увидел обновление вопроса и соответственно поместил комментарий в код.
Комментарии:
1. Если кто-то собирается отклонить проверенный ответ, по крайней мере, прокомментируйте, почему это было сделано. Похоже, это случилось со всеми ответами. Я только что создал учетную запись здесь, и мне не нравится, что к ней попали такие люди, по-видимому, без всякой причины.
2. Это так верно. Я не понимаю, кто это сделал, но мы определенно должны позволить сообществу расти, поощряя практикующего в конструктивной манере. Тогда следует упомянуть в комментариях.
Ответ №4:
Вы можете разложить, отфильтровать и реконструировать объекты следующим образом:
const users = [{name:true,val:false,},{name:true,val:[],dd:0,ee:1,ff:[0,1]}],
res = users.map(i =>
Object.fromEntries(Object.entries(i).filter(([_,v])=>
!Array.isArray(v)amp;amp;v || v.length)) )
console.log(res)