Json过滤数据并按顺序排序

时间:2017-02-02 15:44:31

标签: javascript json

json非常大,所以我需要能够通过以下方式过滤数据:

  • 名称
  • 国家/地区检查严重程度(严重,警告,确定)

按以下方式对数据进行排序:

  • 名称
  • 创建
  • 修饰

我创建了json,但我不确定如何过滤它们或对它们进行排序。

JS:

$(document).ready(function () {

    var showData = $('#results');

    $.getJSON('screenings.json', function (data) {
      console.log(data);

      var results = data.results.map(function (item) {
        return ' Created: ' + item.created + ' Modified: ' + item.modified + ' Name: ' + item.name + ': ' + item.country_check_unknown_severity;
      });

      showData.empty();

      if (results.length) {
        var content = '<li>' + results.join('</li><li>') + '</li>';
        var list = $('<ul />').html(content);
        showData.append(list);
      }
    });

    showData.text('Loading the JSON file.');

});

1 个答案:

答案 0 :(得分:1)

$.getJSON('screenings.json', function (data) {
  // 1 - Generate the objects
  var results = data.results.map(function(item) {
    var o = {};
    o['Created'] = item.created;
    o['Modified'] = item.modified;
    o['Name'] = item.name;
    o['CCUS'] = item.country_check_unknown_severity;

    return o;
  });

  // 2 - Sort the objects
  // the sort function (takes two object compares them depending on the key, and sort order)
  function sortFN(key, ascendant, a, b) {
    var num = ascendant? 1: -1;
    if(a[key] < b[key]) return -num; // return negative if a less than b
    if(a[key] > b[key]) return  num; // return positive if b less than a
    return 0; // return 0 if they are the same
  }

  results.sort(sortFN.bind(null, 'Name', true)); // call sort on objects (explaining bellow)


  // 3 - Generate the strings (generate the strings in any form you want)
  var strings = results.map(function(o){
    var str = "";
    str += "Name: " + o["Name"] + '<br>';
    str += "Modified: " + o["Modified"] + '<br>';
    str += "Created: " + o["Created"] + '<br>';
    str += "CCUS: " + o["CCUS"] + '<br><br>';

    return str;
  })


  // 4 - Show data (show the generated strings)
  showData.empty();
  if (strings.length) {
    var content = '<li>' + strings.join('</li><li>') + '</li>';
    var list = $('<ul />').html(content);
    showData.append(list);
  }
});

排序方法的解释: Array.prototype.sort接受一个回调(函数引用),它将向它传递数组的两个元素。然后回调比较传递给它的两个元素,如果第一个小于第二个,则返回-1,如果第二个小于第一个,则返回+1,如果两个对象是第二个,则返回0相同。现在通常的排序调用是results.sort(sortFN),但由于sortFN需要4个参数而不是2个,我们设法使用sortFN.bind。这种方式很灵活,因为您可以使用任何键以任何顺序对数组进行排序。所以使用这个:

results.sort(sortFN.bind(null, 'Name', false)); // to sort the results array using the key ('Name') in the descending order (false)
// Or...
results.sort(sortFN.bind(null, 'Modified', true)); // to sort it using the key ('Modified') in the ascending order (true)
//...

请注意,日期的排序可能是真空的,因为它比较字符串而不是实际日期。如果您想要更准确的方法,请创建一个函数sortDatesFN并将其传递给sort而不是sortFN

<强>过滤

// 1.5 - Filter objects (this is better be before the sort)
// the filter function (check if a string (value) exist inside the string (o[key])
function filterFN(key, value, o) {
    var prop = o[key].toLowerCase();
    return prop.indexOf(value.toLowerCase()) !== -1; // return true or false (true if prop includes value, false otherwise)
}

results = results.filter(filterFN.bind(null, "CCUS", "warning")); // will filter all objects that have warning in their CCUS property

// 2 - Sort goes here
...

请注意,过滤可以完成一次。您可以按名称过滤结果,然后例如通过CCUS再次过滤过滤后的重新组合。

filter接受回调并将其提供给数组的每个项目,如果该回调返回true,则将其存储在新数组中。要使过滤器更灵活(取三个参数而不是一个),需要进行.bind调用(与上面的sort相同)。所以使用这个:

results = results.filter(filterFN.bind(null, "CCUS", "warning")); // to filter just the object that have "warning" in their CCUS property
// OR...
results = results.filter(filterFN.bind(null, "Name", "s")); // to filter the object that have the character 's' in their Name property.
//...

这可以使用正则表达式完成(value将是正则表达式)而不是检查return prop.indexOf(valu...,它将是return value.test(prop);。 (如果你对当然的正则表达很熟悉。对你提到的需要来说,这并不是必需的。我只是想让你知道它可以用另一种方式完成。)