【问题标题】:Javascript - Get indices of true values in a boolean arrayJavascript - 获取布尔数组中真实值的索引
【发布时间】:2018-06-22 06:20:48
【问题描述】:

假设我有一个包含以下值的数组 -

var arr = [true, true, false, false, false, true, false];

我正在寻找可以给我以下输出的逻辑 -

[0,1,5]

【问题讨论】:

标签: javascript arrays


【解决方案1】:

您可以使用.reduce() 一次性完成此操作:

const arr = [true, true, false, false, false, true, false]
const indices = arr.reduce(
  (out, bool, index) => bool ? out.concat(index) : out, 
  []
)
console.log(indices)

您首先将一个空数组[] 作为initialValue 传递给.reduce(),然后使用ternary ? operator 来确定是否将.concat() 传递给index


或者,您可以使用更新的.flatMap() 方法:

const arr = [true, true, false, false, false, true, false]
const indices = arr.flatMap((bool, index) => bool ? index : [])
console.log(indices)

如果您的浏览器还不支持它,您将收到Uncaught TypeError: arr.flatMap is not a function。在这种情况下,您可以使用我在 here 中的 polyfill 定义。

【讨论】:

    【解决方案2】:

    您可以映射索引或虚假值-1,然后过滤所有不是-1 的索引。

    var array = [true, true, false, false, false, true, false],
        result = array
            .map((b, i) => b ? i : -1)
            .filter(i => i !== -1);
            
    console.log(result);

    【讨论】:

      【解决方案3】:

      一个可能更优雅的解决方案是:

      [...arr.keys()].filter(i => arr[i])
      

      或者

      [...arr.entries()].filter(([, v]) => v).map(([i]) => i)
      

      【讨论】:

        【解决方案4】:

        您可以简单地使用循环并检查您的 if 条件中的布尔值 true

        var arr = [true, true, false, false, false, true, false];
        var indexArray = [];
        arr.forEach((val, index) => {
          if(val){
            indexArray.push(index);
          }
        });
        
        console.log(indexArray);

        【讨论】:

          【解决方案5】:

          试试这个

          var arr = [true, true, false, false, false, true, false];
          var indexArray = [];
          arr.forEach(function(value, index) {
              if (value) {
                  indexArray.push(index);
              }
          })
          console.log(indexArray);

          【讨论】:

            【解决方案6】:

            基于逻辑本身而非 JS 范式的不同解决方案

            let newArr = [];
            for (let i = 0 ; i<indexArray.length;i++){
                if (indexArray[i]) newArr.push(i)
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-11-08
              • 2012-10-16
              • 2020-09-30
              • 1970-01-01
              相关资源
              最近更新 更多