.filter在HTML表上不返回数据- JavaScript
.filter on HTML table returns no data - JavaScript
我正在尝试创建一个表,允许您过滤和排序cats.json中包含的JSON数据:
[{
"breed" : "Abyssinian",
"country" : "Ethiopia",
"coffeePreference" : "espresso",
"picture" : "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9b/Gustav_chocolate.jpg/100px-Gustav_chocolate.jpg"
}, {
"breed" : "Aegean",
"country" : "Greece",
"coffeePreference" : "medium roast, cream and sugar",
"picture" : "https://upload.wikimedia.org/wikipedia/commons/thumb/5/51/Aegean_cat.jpg/100px-Aegean_cat.jpg"
}]
我能够用以下方法对数据进行排序。基本上,我已经小心地嵌套了一系列回调函数。下面的代码展示了我是如何成功排序和渲染的。
function renderData(cats){
var output='<table id="indextable" border="1" cellpadding="10" cellspacing="0" style="border-collapse:collapse;">';
output+="<thead>"
output+="<tr>";
output+="<th> HeadShot </th>";
output+="<th><button onclick='getSortedBreedData()'>Breed</button></th>";
output+="<th><button onclick='getSortedCountryData()'>Country</button></th>";
output+="<th><button onclick='getSortedCoffeeData()'>CoffeePreference</button></th>";
output+="</tr>";
output+="</thead>"
for (var i in cats) {
output+="<tbody>"
output+="<tr>";
output+="<td><img src='" + cats[i].picture+"' alt='missing cat picture'></td>"
output+="<td>" + cats[i].breed + "</td>"
output+="<td>" + cats[i].country + "</td>"
output+="<td>" + cats[i].coffeePreference + "</td>"
output+="</tr>";
output+="</tbody>"
}
output+="</table>";
document.getElementById("catTable").innerHTML=output;
}
function getData(){
$.getJSON('cats.json', function(cats) {
var cats = cats;
renderData(cats);
});
}
var sortCountry;
function getSortedCountryData(){
$.getJSON('cats.json', function(cats) {
var cats = cats;
if (sortCountry!=true)
sortData(cats,'country',1);
else
sortData(cats,'country',-1);
sortCountry ^= true;
});
}
var sortBreed;
function getSortedBreedData(){
$.getJSON('cats.json', function(cats) {
var cats = cats;
if (sortBreed!=true)
sortData(cats,'breed',1);
else
sortData(cats,'breed',-1);
sortBreed ^= true;
});
}
var sortCoffee;
function getSortedCoffeeData(){
$.getJSON('cats.json', function(cats) {
var cats = cats;
if (sortCoffee!=true)
sortData(cats,'coffeePreference',1);
else
sortData(cats,'coffeePreference',-1);
sortCoffee ^= true;
});
}
function sortData(cats, element, direction){
switch(element) {
case 'breed':
var sortedData = cats.sort(function(a,b){return (a.breed < b.breed) ? -1*direction : 1*direction;});
renderData(cats);
break;
case 'country':
var sortedData = cats.sort(function(a,b){return (a.country < b.country) ? -1*direction : 1*direction;});
renderData(cats);
break;
case 'coffeePreference':
var sortedData = cats.sort(function(a,b){return (a.coffeePreference < b.coffeePreference) ? -1*direction : 1*direction;});
renderData(cats);
default:
renderData(cats);
}
}
问题在于过滤。我基本上是在尝试类似的方法。在HTML中,我有一个字段,其中输入的数据被捕获。我确信这是正常发生的。
<label for="filter">Filter</label>
<input type="text" name="filter" value="" id="filter" onchange="filterCats()" />
一旦数据被捕获:
function filterCats(){
$.getJSON('cats.json', function(cats) {
var cats = cats;
var criteria = document.getElementById('filter').value;
filterCats2(cats, criteria);
});
}
function filterCats2(cats, criteria){
var filteredData = cats.filter(function(c){return c.breed === criteria;});
renderData(filteredData);
}
这将呈现一个空表。表头是所有出现的内容。我也试过alert(filteredData);alert(filteredData[0])返回undefined;和警报(filteredData [0] .breed);返回什么。对于这里正在发生的事情,任何帮助都将非常感激!
我在这里创建了您的示例;https://jsfiddle.net/9xftex5o/3/没有$.getJSON()
调用,因为cats对象被包含为data
。
呈现过滤结果的代码可以工作,但是为更改事件连接过滤函数却不能。
过滤器功能可为;
function filterCats() {
var criteria = document.getElementById('filter').value;
var cats = data;
var filteredData = cats.filter(function (c) {
return c.breed === criteria;
});
renderData(filteredData);
};
连接事件;
$(document).ready(function () {
var cats = data; // initialise data instead of $.getJSON
renderData(cats); // show results
$('#filter').on('change', filterCats); // event hook
});
导致此问题的原因是您的过滤器函数设置为完全匹配返回。
如果你想用contains或start with condition来过滤,你应该像下面这样改变你的过滤器....
// case sensitive and start with
return c.breed.indexOf(criteria) === 0 ;
// case sensitive and contains
return c.breed.indexOf(criteria) !== -1 ;
// case insensitive and start with
return c.breed.toUpperCase().indexOf(criteria.toUpperCase()) === 0 ;
// case insensitive and contains
return c.breed.toUpperCase().indexOf(criteria.toUpperCase()) !== -1 ;
一个固定的jsfield在这里http://jsfiddle.net/j92009zv/1/
相关文章:
- AJAX调用并在Node中获取返回数据
- 角度服务未返回数据
- 统计ajax返回数据中的html元素
- 有没有更好的方法可以测量从Ajax调用返回数据所需的总时间
- Imgur API图像搜索未返回数据
- javascript对象显示为null,但object.properties返回数据
- 如何从ajax调用JQuery返回数据
- 试图从嵌套的回调函数返回数据
- NodeJS FS 不从多个文件返回数据
- ajax函数未在C#中返回数据
- 如何在公共js模块中从web服务返回数据
- 将字符串与 JSON 对象组合以返回数据
- 嵌套异步函数未及时返回数据的问题
- NodeJS JSONStream 以一个长字符串的形式返回数据
- 如何使用 HTML 图像请求将数据发送到服务器,或返回数据作为响应
- 从 Angular 模态服务中的模态主体模板返回数据
- jQuery 每个循环返回数据两次
- $.getJSON 在返回数据后不会运行函数
- 如何访问返回数据中的特定json值
- 工厂返回数据后未设置角度$scope