【问题标题】:Query through Json object通过Json对象查询
【发布时间】:2014-06-19 06:44:57
【问题描述】:

这是我的 JSON:

[{"Id":1,"Order":1,"IsDone":true,"Text":"abc","Date":"6/14/2014"},
 {"Id":2,"Order":2,"IsDone":false,"Text":"cde","Date":"6/15/2014"},
 {"Id":3,"Order":3,"IsDone":false,"Text":"fgh","Date":"6/16/2014"}]

获取 IsDone == true 计数的最有效方法是什么?

【问题讨论】:

  • 您的代码看起来不像 JSON 对象,而是一个对象数组。另外,这是 JavaScript 中非常基本的任务,您尝试过什么?
  • 最有效的方法是使用 for 循环。这是解释 => stackoverflow.com/questions/8550183/…
  • LINQ.js 也可以工作,而且我看到的速度非常快
  • 我确实做了循环方法。但只是想知道是否有另一种方法来解决这个问题。顺便谢谢。
  • “最高效”的方式是什么?我怀疑任何发布的答案都会比常规的for 循环更快。除非数据已排序,否则您将需要遍历数组中的所有元素。

标签: javascript


【解决方案1】:

您可以使用纯 javascript 迭代:

var a=[{"Id":1,"Order":1,"IsDone":true,"Text":"abc","Date":"6/14/2014"},{"Id":2,"Order":2,"IsDone":false,"Text":"cde","Date":"6/15/2014"},{"Id":3,"Order":3,"IsDone":false,"Text":"fgh","Date":"6/16/2014"}]

var ct=0;
a.forEach(function(entry) {
    if(entry.IsDone)ct++;
});
alert(ct);

【讨论】:

    【解决方案2】:

    在 jquery 中使用 grep

    var selectedArray = [{"Id":1,"Order":1,"IsDone":true,"Text":"abc","Date":"6/14/2014"},
    {"Id":2,"Order":2,"IsDone":false,"Text":"cde","Date":"6/15/2014"},
    {"Id":3,"Order":3,"IsDone":false,"Text":"fgh","Date":"6/16/2014"}]
    
    
    
    selectedArray = jQuery.grep(selectedArray, function (el) { return el.IsDone == true;   });
    
     alert(selectedArray.length);
    

    其中 seletedArray 是您的实际数组

    http://jsfiddle.net/QxV6K/

    【讨论】:

      【解决方案3】:
      var data = [{"Id":1,"Order":1,"IsDone":true,"Text":"abc","Date":"6/14/2014"},{"Id":2,"Order":2,"IsDone":false,"Text":"cde","Date":"6/15/2014"},{"Id":3,"Order":3,"IsDone":false,"Text":"fgh","Date":"6/16/2014"}];
      
      var count = data.filter(function (el) {
        return (el.IsDone === true);
      });
      
      alert(count.length);
      

      DEMO

      【讨论】:

        【解决方案4】:

        试试这个

         var obj = [{"Id":1,"Order":1,"IsDone":true,"Text":"abc","Date":"6/14/2014"},
            {"Id":2,"Order":2,"IsDone":false,"Text":"cde","Date":"6/15/2014"},
            {"Id":3,"Order":3,"IsDone":false,"Text":"fgh","Date":"6/16/2014"}]
        
            var count = 0;
            for(i=0;i<obj.length;i--){
              count += (obj[i].IsDone) ? 1 : 0;
            }
        

        【讨论】:

          【解决方案5】:

          如果您尝试通过 id 或名称访问示例结构中的项目,但不知道它在数组中的位置,最简单的方法是使用 underscore.js 库:

              var data =   [{"Id":1,"Order":1,"IsDone":true,"Text":"abc","Date":"6/14/2014"},{"Id":2,"Order":2,"IsDone":false,"Text":"cde","Date":"6/15/2014"},{"Id":3,"Order":3,"IsDone":false,"Text":"fgh","Date":"6/16/2014"}];
          
              var allDesiredElements = _.filter(data, function(item) {
                return item.IsDone === true;
              });
          
          //for length use
          console.log(allDesiredElements.length);
          

          【讨论】:

          • _.find 只找到第一个,而不是全部。
          • 我想你其实想要_.filter
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-05
          • 2018-05-24
          • 2015-10-12
          相关资源
          最近更新 更多