【问题标题】:Iterate through Object keys to return true value only遍历对象键以仅返回真值
【发布时间】:2019-07-01 02:39:39
【问题描述】:

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

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

我的代码:

function displayOptions(displayDevice) {
  for(var key in displayDevice) {
    if(displayDevice[key] === true) {
      return Object.keys(displayDevice);
    }
  }
}

var televisionA = {
  VGA: false,
  HDMI1: true,
  HDMI2: true
}
var monitor001 = {
  VGA: true,
  DVI: false,
  HDMI1: true,
  HDMI2: true
}
var monitor002 = {
  HDMI1: true,
  HDMI2: true,
  DVI: true
}

displayOptions(televisionA); //["HDMI1", "HDMI2"];
displayOptions(monitor001); //["VGA", "HDMI1", "HDMI2"];

【问题讨论】:

    标签: javascript arrays object boolean


    【解决方案1】:

    主要问题是当您找到第一个具有true 值的key 时,您正在返回所有对象键(请阅读Object.keys() 所做的事情)。在我看来,当找到true 值时,您需要创建一个新数组并在其上按下键。

    function displayOptions(displayDevice)
    {
        let newObj = [];
    
        for (var key in displayDevice)
        {
            if (displayDevice[key] === true) // or just if (displayDevice[key])
                newObj.push(key);
        }
    
        return newObj;
    }
    
    var televisionA = {
      VGA: false,
      HDMI1: true,
      HDMI2: true
    }
    var monitor001 = {
      VGA: true,
      DVI: false,
      HDMI1: true,
      HDMI2: true
    }
    var monitor002 = {
      HDMI1: true,
      HDMI2: true,
      DVI: true
    }
    
    console.log(displayOptions(televisionA)); // ["HDMI1", "HDMI2"];
    console.log(displayOptions(monitor001));  // ["VGA", "HDMI1", "HDMI2"];
    .as-console {background-color:black !important; color:lime;}
    .as-console-wrapper {max-height:100% !important; top:0;}

    【讨论】:

    • 好吧,有道理!刚刚试了一下,它奏效了:D 谢谢 - 你的解释也帮助了很多!我知道 .filter() 更容易做到,但我想确保我也了解我是如何到达那里的。
    【解决方案2】:

    仅供参考,由于我在回复中没有看到,另一种选择可以是reduce

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

    【讨论】:

      【解决方案3】:

      filter更容易:

      function displayOptions(displayDevice) {
        return Object.entries(displayDevice).filter(([, bool]) => bool).map(e => e[0]);
      }
      
      var televisionA = {
        VGA: false,
        HDMI1: true,
        HDMI2: true
      }
      var monitor001 = {
        VGA: true,
        DVI: false,
        HDMI1: true,
        HDMI2: true
      }
      var monitor002 = {
        HDMI1: true,
        HDMI2: true,
        DVI: true
      }
      
      console.log(displayOptions(televisionA));
      console.log(displayOptions(monitor001));

      【讨论】:

        【解决方案4】:

        使用 Object.keys 获取密钥并根据真假过滤

        var televisionA = {
          VGA: false,
          HDMI1: true,
          HDMI2: true
        }
        var monitor001 = {
          VGA: true,
          DVI: false,
          HDMI1: true,
          HDMI2: true
        }
        var monitor002 = {
          HDMI1: true,
          HDMI2: true,
          DVI: true
        }
        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]))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-05
          • 2011-10-12
          • 1970-01-01
          • 2012-12-29
          • 2020-07-21
          • 2020-01-06
          • 2017-12-28
          • 2021-12-16
          相关资源
          最近更新 更多