Javascript 迭代对象键以仅返回真值

Javascript 迭代对象键以仅返回真值,javascript,arrays,object,boolean,Javascript,Arrays,Object,Boolean,问题说明:编写一个函数displayOptions,它接收一个对象“displayDevice”,并返回一个数组。输入对象的属性将是“视频输出”选项,每个选项都有一个true或false值。您的函数应该收集所有具有真值的“视频输出”名称 我用.filter()方法找到了解决这个问题的方法,但是,我并不完全理解这一点,我想尝试使用for..in语句来解决这个问题。我可以遍历对象,但它返回数组中的所有键,而不仅仅是“真”键。让我知道我哪里出错了 我的代码: 功能显示选项(显示设备){ 用于(显示设

问题说明:编写一个函数displayOptions,它接收一个对象“displayDevice”,并返回一个数组。输入对象的属性将是“视频输出”选项,每个选项都有一个true或false值。您的函数应该收集所有具有真值的“视频输出”名称

我用.filter()方法找到了解决这个问题的方法,但是,我并不完全理解这一点,我想尝试使用for..in语句来解决这个问题。我可以遍历对象,但它返回数组中的所有键,而不仅仅是“真”键。让我知道我哪里出错了

我的代码:

功能显示选项(显示设备){
用于(显示设备中的var键){
if(显示设备[键]==真){
返回对象。键(显示设备);
}
}
}
var televisionA={
答:错,
HDMI1:是的,
HDMI2:对
}
变量监视器001={
是的,
DVI:错,
HDMI1:是的,
HDMI2:对
}
变量监视器002={
HDMI1:是的,
HDMI2:是的,
DVI:是的
}
显示选项(电视)//[“HDMI1”、“HDMI2”];

显示选项(监视器001)//[“VGA”、“HDMI1”、“HDMI2”]使用Object.keys获取密钥,并根据真/假对其进行筛选

var-televisionA={
答:错,
HDMI1:是的,
HDMI2:对
}
变量监视器001={
是的,
DVI:错,
HDMI1:是的,
HDMI2:对
}
变量监视器002={
HDMI1:是的,
HDMI2:是的,
DVI:是的
}
console.log(Object.keys(televisionA).filter((e)=>televisionA[e]))
console.log(Object.keys(monitor001).filter((e)=>monitor001[e]))

console.log(Object.keys(monitor002).filter((e)=>monitor002[e]))
过滤更容易:

功能显示选项(显示设备){
返回Object.entries(displayDevice).filter(([,bool])=>bool.map(e=>e[0]);
}
var televisionA={
答:错,
HDMI1:是的,
HDMI2:对
}
变量监视器001={
是的,
DVI:错,
HDMI1:是的,
HDMI2:对
}
变量监视器002={
HDMI1:是的,
HDMI2:是的,
DVI:是的
}
console.log(displayOptions(televisionA));

console.log(显示选项(monitor001))
主要问题是,当您找到第一个
的值为
true
时,您返回的是所有对象键(读取所做的操作)。在我看来,当找到
true
值时,您需要创建一个新数组并按下该数组上的键

功能显示选项(显示设备)
{
设newObj=[];
用于(显示设备中的var键)
{
if(displayDevice[key]==true)//或者仅仅if(displayDevice[key])
newObj.推(键);
}
返回newObj;
}
var televisionA={
答:错,
HDMI1:是的,
HDMI2:对
}
变量监视器001={
是的,
DVI:错,
HDMI1:是的,
HDMI2:对
}
变量监视器002={
HDMI1:是的,
HDMI2:是的,
DVI:是的
}
console.log(显示选项(电视));//[“HDMI1”、“HDMI2”];
console.log(displayOptions(monitor001));//[“VGA”、“HDMI1”、“HDMI2”]
.as控制台{背景色:黑色!重要;颜色:石灰;}

.作为控制台包装{max height:100%!important;top:0;}
仅供将来参考,因为我在回复中没有看到,另一种选择可以是
reduce

const displayOptions = displayDevice =>
  Object.entries(displayDevice)
    .reduce((acc, [key, val]) => (val && acc.push(key), acc),[]);

好吧,这是有道理的!只是试了一下,效果很好:D谢谢你——你的解释也帮了大忙!我知道.filter()更容易实现,但我想确保我也理解了我是如何做到这一点的。