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.');
});
答案 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);
。 (如果你对当然的正则表达很熟悉。对你提到的需要来说,这并不是必需的。我只是想让你知道它可以用另一种方式完成。)