【问题标题】:How should I implement a function to find indices of non-true elements of an array?我应该如何实现一个函数来查找数组的非真实元素的索引?
【发布时间】:2011-07-16 23:05:16
【问题描述】:

我有一个名为uncompletedSteps()的函数:

function uncompletedSteps(completedSteps) {
    // completedSteps is an array
}

这个函数应该检查completedSteps并返回所有不等于truecompletedSteps元素的索引:

if (completedSteps[i] === true) {
    // add to return list
}

换句话说,如果有:

var completedSteps = [
    true,
    null,
    true
];

那么uncompletedSteps() 应该返回[0, 2]

uncompletedSteps() 应该是什么样的? (ECMAScript5 可以。)

【问题讨论】:

    标签: javascript arrays indexing boolean ecmascript-5


    【解决方案1】:

    这个函数应该检查 completedSteps 并返回所有不等于 true 的 completedSteps 元素的索引:

    使用以下过程实现向后兼容性:

    • 多次替换以插入字符串null 的值converted to empty strings
    • 一个replace 删除true
    • 另一个 replace 带有替换回调以插入索引
    • 另一个replace 删除前导逗号
    • 另一个replace 删除成对的逗号

    例如:

    function foo(match, offset, fullstring)
      {
      foo.i = foo.i + 1 || 0;
      if (match === "true") 
        {
        return "";
        }
      else
        {
        return foo.i;
        }
      }
    
    function uncompletedSteps(node)
      {
      return String(node).replace(/^,/ , "null,").replace(/,$/ , ",null").replace(/,,/g , ",null,").replace(/[^,]+/g, foo).replace(/^,/,"").replace(/,,/g,",")
      }
    
    var completedSteps = [
        null,
        true,
        false,
        true,
        null,
        false,
        true,
        null
    ];
    
    uncompletedSteps(completedSteps); // "0,2,4,5,7"
    

    【讨论】:

      【解决方案2】:

      使用reduce

      function uncompletedSteps(steps){
         return steps.reduce(function(memo, entry, i) { 
            return memo.concat(entry ? i : []);
         }, [])
      }
      

      使用forEach

      function uncompletedSteps(steps){
         var uncompleted = [];
         steps.forEach(function(entry,i) { 
            if(entry) uncompleted.push(i); 
         })
         return uncompleted;
      }
      

      使用mapfilter

      function uncompletedSteps(steps){
         return steps.map(function(entry, i) {
            return entry ? i : null;
         }).filter(function(entry) {
            return entry != null;
         });
      }
      

      【讨论】:

        【解决方案3】:
        var arr = [true, true, null, true];
        arr.map(function(el, i) { 
            return el ? i : -1; 
        }).filter(function(el) {
            return el != -1;
        })
        

        返回:

         [0, 1, 3]
        

        【讨论】:

          【解决方案4】:
          var count = [];
          for ( var i = 0; i<completedSteps.length; i++ ) {
            if(completedSteps[i]) {
              count.push(i);
            }
          }
          return count;
          

          【讨论】:

          • 其实我已经实现了。我的问题是是否有更简洁的方法来做到这一点。
          猜你喜欢
          • 2018-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-22
          • 2013-07-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多