如何使用underscore.js从JSON文件获取/过滤所有结果

时间:2013-12-05 17:18:54

标签: javascript jquery json underscore.js

我有这个(缩短了问题)JSON文件:

[
  {
   "product":"aardappelen gebakken",
   "quantity":"100gr",
   "carbohydrates":"19,3"
  },
  {
   "product":"aardappelen pikant",
   "quantity":"100gr",
   "carbohydrates":"3"
  },

  {
   "product":"aardappelmeel",
   "quantity":"100gr",
   "carbohydrates":"80"
  }
]

Wat我想做的是:

搜索产品,并查看其所有内容,例如当我搜索“aardappelmeel”时,我会获得产品,数量和碳水化合物的关键值,我使用此代码执行此操作:

目前搜索词是硬编码的,这将是后来的版本。

$(function() {

    $.getJSON( "js/data.json").fail(function(jqxhr, textStatus, error) {
    var err = textStatus + ", " + error;
    console.log( "Request Failed: " + err );
    }).done(function(data) {
    var carbohydratesResult = getCarbohydrates(data, 'aardappelmeel');
    console.log(carbohydratesResult);
  });

});

function getCarbohydrates(arr, searchTerm){
  var result;
  if(searchTerm === '') {
    result = 'No searchterm';
  }
  else {
    result = _.where(arr, {product: searchTerm});
  }
 return result;
}

这得到1个结果:

enter image description here

问题:当我搜索“aardappelen”时,我没有得到结果,它应该是2,因为有2个产品包含名称“aardappelen”。我该怎么做?

我使用jQuery,Underscore。如果我不需要Underscore,请告诉我当“产品”值包含搜索词时,如何修改我的代码以获得更多结果。

2 个答案:

答案 0 :(得分:2)

您需要_.filterindexOf一起进行子字符串搜索:

result = _.filter(arr, function(item) {
    return item.product && item.product.indexOf(searchTerm) != -1;
});

请注意,_.where执行完全匹配。

答案 1 :(得分:1)

我可能会说这不需要下划线(不是最佳包含整个js库只需使用单个函数)。仅使用JavaScript搜索文本永远不会有趣。你可能最好编写一些循环遍及结果集并试图匹配某些文本的正则表达式函数。

如果可能,我会尝试在服务器端实现搜索功能,并在ajax请求中返回这些结果。

JS解决方案的粗略示例......

var searchText = 'blah',
    matches = [];
for(var i = 0; i < results.length; i++) {
    var reg = new RegExp(searchText);
    if(results[i].product.match(reg)) matches.push(results[i]);
}

return matches;