【问题标题】:Invert an array of booleans in JavaScript在 JavaScript 中反转布尔数组
【发布时间】:2017-08-25 03:33:18
【问题描述】:

我正在尝试反转一串布尔值的值,以便代替

inverted([true, false, true, false, true])

[false, true, false, true, false]

到目前为止,我想出了这个:

function inverted(bools) {
    var inversion = [];
    var string= [];
    while(!bools) {
      string.push(bools);
    }
    return inversion;
}

但我的代码无法正常工作,任何和所有帮助将不胜感激!

【问题讨论】:

  • 坦率地说,您的代码中存在明显的问题 - 您更新字符串变量但最终返回反转数组。您还假设并使用真实条件进行迭代。您需要对数组进行迭代并在布尔值上推送一个反转。

标签: javascript arrays boolean


【解决方案1】:

let myArray = [true, false, false, true]
// single line solution:
let invertedArray = myArray.map((bool) => !bool)

console.log(invertedArray)

【讨论】:

    【解决方案2】:

    虽然这里的许多答案已经很好了,但我想我会加入我的“高尔夫”正则表达式解决方案:

    function inverted (b) {
     return b.map(/f/.test, /f/)
    }
    
    console.log(
      inverted([true, false, true, false])
    )

    【讨论】:

      【解决方案3】:

      这是实现这一目标的另一种方法:

      var booleans = [true, false, true, false, true];
      
      function inverted(bools) {
          var inversion = [],i=0;
      
          while(i< bools.length) {
            inversion.push(!(bools[i]));
            i++;
          }
          return inversion;
      }
      
      var inverted =  inverted(booleans);
      
      console.log(inverted);//Outpu : [false, true, false, true, false]
      

      【讨论】:

        【解决方案4】:

        您需要使用 bools.split() 拆分布尔值。然后你可以检查并反转它们。在返回之前,您也没有在 inversion[] 中放入任何内容。像下面这样的东西应该可以工作:

        function inverted(bools) {
        var inversion = [];
        var string= bools.split(",");
        for(var i=0; i<string.length(); i++) {
          inversion.push(string[i]);
        }
        
        return inversion;
        
        }
        

        【讨论】:

          【解决方案5】:

          你可以这样做:

          const booleans = "[true, false, true, false, true]";
          const inverted = JSON.stringify(JSON.parse(booleans).map(b => !b));
          
          console.log(inverted);

          如果通过“字符串”,你实际上是指一个数组,你不需要转换成字符串/从字符串转换,可以这样做:

          const booleans = [true, false, true, false, true];
          const inverted = booleans.map(b => !b);
          

          【讨论】:

            【解决方案6】:

            您的代码只是一个大错误。您不了解使用数组的基本原则。不要只使用我的解决方案,请阅读一些关于迭代和从数组中获取元素的文章。这个应该可以:

            function inverted(bools) {
              var i, _i, inversion = [];
            
              for(i = 0, _i = bools.length; i < _i; i++){
                inversion[i] = !bools[i];
              }
              return inversion;
            }
            

            【讨论】:

            • @RobbyCornelissen,我通常会优化我的代码以提高性能。我在 Chrome 中使用 for 的代码比使用 map 的代码快 12 倍。 jsperf.com/inverting-an-array
            • @RobbyCornelissen 之前的评论可能是两个 cmets。第一个包括前两个句子,第二个包括其余句子;为了不减损前者。或者,仅前两句,省略其余评论。
            • @guest271314 你是对的。我觉得这个答案前两句的语气让我有点愤愤不平。我会重写我的评论。
            • @Zibx 点了,我的评论不合时宜。在 Chrome 上,您的代码运行速度确实快了 12 倍,而在 Firefox 上几乎快了两倍。
            【解决方案7】:
            function inverted(bools) {
              for(var i = 0; i < bools.length; i++) {
                 bools[i] = !bools[i];
               }
              return bools;
            }
            

            把它当作

            var bools = [true, false, true];
            bools = inverted(bools);
            

            【讨论】:

              【解决方案8】:

              您可以使用.map()! 运算符来反转Boolean 的值,返回结果数组

              function inverted(bools) {
                 return bools.map(function(bool) {return !bool})
              }
              

              【讨论】:

              • 如果输入实际上是"[true, false, true, false, true]"inverted("[true, false, true, false, true]".match(/true|false/g).map(eval))inverted("[true, false, true, false, true]".match(/true|false/g).map(function(bool){return bool === "true"}))
              • 您可以使用前瞻避免evalinverted("[true, false, true, false, true]".match(/true|(?=false)/g).map(Boolean))
              • @gyre "[true, false, true, false, true]".replace(/(true)|(false)/g, function(match, p1, p2) {return p1 ? false : true})
              • 两个有效选项,只是觉得值得一提:)
              • @gyre 是的,在您的方法中有趣的生成和使用空字符串。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-31
              • 2012-11-23
              • 1970-01-01
              • 2017-09-15
              • 2014-12-11
              • 1970-01-01
              相关资源
              最近更新 更多