将填充了布尔值的对象转换为布尔值为True的字符串数组

时间:2019-03-07 14:23:07

标签: javascript typescript

假设我有一个这样的对象:

likedFoods:{
  pizza:true,
  pasta:false,
  steak:true,
  salad:false
}

我想过滤掉错误并像这样将其转换为字符串数组:

compiledLikedFoods = ["pizza", "steak"]

做到这一点的最佳方法不是简单的:

if (this.likedFoods.pizza == true) {this.compiledLikedFoods.push('pizza')};
if (this.likedFoods.pasta == true) {this.compiledLikedFoods.push('pasta')}'
if (this.likedFoods.steak == true) {this.compiledLikedFoods.push('steak')}'
if (this.likedFoods.salad == true) {this.compiledLikedFoods.push('salad')}'

(如果有)

谢谢。

4 个答案:

答案 0 :(得分:6)

我将按其值过滤对象键

const likedFoods = {
  pizza:true,
  pasta:false,
  steak:true,
  salad:false
};
const compiledFood = Object.keys(likedFoods).filter(key => likedFoods[key] === true);
console.log(compiledFood); //["pizza", "steak"]

答案 1 :(得分:2)

我可能会在reduce返回的数组上使用循环或Object.entries

循环:

const compiledLikedFoods = [];
for (const [name, value] of Object.entries(likedFoods)) {
    if (value) {
        compiledLikedFoods.push(name);
    }
}

reduce(因为可以将任何数组op塞入reduce中):

const compiledLikedFoods = Object.values(likedFoods).reduce((array, [name, value]) => {
    if (value) {
        array.push(name);
    }
    return array;
}, []);

但请参阅Andrey's much simpler solution(悬着头。)

答案 2 :(得分:2)

您只需获取tke键并按值过滤即可。

var likedFoods = { pizza: true, pasta: false, steak: true, salad: false },
    compiledLikedFoods = Object.keys(likedFoods).filter(k => likedFoods[k]);

console.log(compiledLikedFoods);

答案 3 :(得分:2)

如果 value true,则可以使用for...in遍历对象并将 key 推入数组:

var likedFoods={
  pizza:true,
  pasta:false,
  steak:true,
  salad:false
}
var compiledLikedFoods = [];
for(var o in likedFoods){
  if(likedFoods[o])
    compiledLikedFoods.push(o);
}
console.log(compiledLikedFoods)