Javascript“赞”函数对数组

时间:2019-03-08 20:51:49

标签: javascript

我已经阅读了堆栈溢出的其他项目,到目前为止,没有任何工作,或者我可能不理解它们。

我希望用户能够在字段中键入一个值,这样可以检查数组中的每个项目,然后返回匹配的项目。

这是数组的示例。

[{
"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;

    });

但这只会返回完全匹配,而不是“喜欢”匹配。

4 个答案:

答案 0 :(得分:2)

您可以通过解决此问题

el.Description.toLowerCase().indexOf($('#dynamId').val().toLowerCase()) !== -1

IndexOf扫描字符串并返回找到匹配项的索引。精简所有内容,以便进行适当的搜索。

答案 1 :(得分:1)

您应该使用indexOftoLowerCase(如果不区分大小写),而不是==

示例(使用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方法。