我已经阅读了堆栈溢出的其他项目,到目前为止,没有任何工作,或者我可能不理解它们。
我希望用户能够在字段中键入一个值,这样可以检查数组中的每个项目,然后返回匹配的项目。
这是数组的示例。
[{
"ID": 249,
"SetNumber": 7993,
"URL": "https://www.lego.com/biassets/bi/4516696.pdf",
"Images": "https://www.lego.com/biassets/biimg/4516696.png",
"Description": "Service Station",
"Notes": "BUILD.INSTR.3006, 7993 NA 2/2",
"DashedNumber": "7993-1"
},
{
"ID": 250,
"SetNumber": 7994,
"URL": "https://www.lego.com/biassets/bi/4516447.pdf",
"Images": "https://www.lego.com/biassets/biimg/4516447.png",
"Description": "LEGO City Harbor",
"Notes": "BUILD.INSTR.3006, 7994 2/3",
"DashedNumber": "7994-1"
},
{
"ID": 251,
"SetNumber": 7994,
"URL": "https://www.lego.com/biassets/bi/4516451.pdf",
"Images": "https://www.lego.com/biassets/biimg/4516451.png",
"Description": "LEGO City Harbor",
"Notes": "BUILD.INSTR.3006, 7994 3/3",
"DashedNumber": "7994-1"
}]
因此客户可以输入Lego,然后显示后两个。
到目前为止,这是我的代码
$(document).ready(function () {
$('#search-now').click(function () {
var newArray = obj.results.filter(function (el) {
return el.ID &&
el.SetNumber &&
el.Images &&
el.URL &&
el.Description == $('#dynamId').val() &&
el.Notes &&
el.DashedNumber;
});
但这只会返回完全匹配,而不是“喜欢”匹配。
答案 0 :(得分:2)
您可以通过解决此问题
el.Description.toLowerCase().indexOf($('#dynamId').val().toLowerCase()) !== -1
IndexOf扫描字符串并返回找到匹配项的索引。精简所有内容,以便进行适当的搜索。
答案 1 :(得分:1)
您应该使用indexOf
和toLowerCase
(如果不区分大小写),而不是==
。
示例(使用Lodash filter
方法;可以与您的find方法互换)
let legoProducts = [{
"ID": 249,
"SetNumber": 7993,
"URL": "https://www.lego.com/biassets/bi/4516696.pdf",
"Images": "https://www.lego.com/biassets/biimg/4516696.png",
"Description": "Service Station",
"Notes": "BUILD.INSTR.3006, 7993 NA 2/2",
"DashedNumber": "7993-1"
},
{
"ID": 250,
"SetNumber": 7994,
"URL": "https://www.lego.com/biassets/bi/4516447.pdf",
"Images": "https://www.lego.com/biassets/biimg/4516447.png",
"Description": "LEGO City Harbor",
"Notes": "BUILD.INSTR.3006, 7994 2/3",
"DashedNumber": "7994-1"
},
{
"ID": 251,
"SetNumber": 7994,
"URL": "https://www.lego.com/biassets/bi/4516451.pdf",
"Images": "https://www.lego.com/biassets/biimg/4516451.png",
"Description": "LEGO City Harbor",
"Notes": "BUILD.INSTR.3006, 7994 3/3",
"DashedNumber": "7994-1"
}];
let searchString = 'Lego';
let result = _.filter(legoProducts, function(object) {
return object.Description.toLowerCase().indexOf(searchString.toLowerCase()) != -1;
});
console.log(result);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
答案 2 :(得分:0)
&&
运算符完全匹配。要匹配like
,您需要使用||
运算符。
但是没有任何值的测试属性将返回true,直到它不是未定义或虚假的值为止。因此,如果要验证例如,您将需要测试一些值。
return el.ID == 56 || el.SetNumber == 234 ...
无需测试值,您将匹配实际上具有真实值的值,例如:
[
{
"ID": 23,
"SetNumber": 53
},
{
"SetNumber": 78
}
]
.filter(function(el) {
return el.ID;
})
这将与示例中的第一个对象匹配,因为此数组中的第二个对象未定义ID属性。
尽管,这似乎是一种模糊的方法。我建议您使用以下值进行检查:
return typeof el.ID !== 'undefined'
答案 3 :(得分:0)
您应该使用正则表达式(例如new Regex('. *'+$('#dynamId').val()+'. *')
而不是==
运算符,并对您要关注的字段使用match方法。