Получите все истинные значения из массива объектов

#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. Выполните итерацию по каждому ключу объекта (Объект.ключи(пользователь).уменьшить)
  3. Добавьте пару значений ключа только в том случае, если значение соответствует действительности.

Обратите внимание, что это вернет новую структуру, а не изменит существующую. Я увидел обновление вопроса и соответственно поместил комментарий в код.

Комментарии:

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)