2013-05-02 217 views
1

我需要对现有代码进行扩展,无法更改它。 有此阵:javascript在数组中找到具有特定属性的对象

var availableTags = [ 
     { label: "Yoga classes", category: "EDUCATIONAL" }, 
     { label: "Cooking classes", category: "EDUCATIONAL" }, 
     { label: "Cheese tastings", category: "EDUCATIONAL" }, 
     { label: "Maker Workshops", category: "PRACTICAL" }, 
     { label: "Seminars", category: "PRACTICAL" }, 
     //many more of these 
]; 

现在,我需要检查,如果在输入框中输入的文本包括在标签,例如之一如果用户输入“瑜伽课程”=>确定,如果“Yoga”=> NOK,“sdsdf”=> NOK等。

这样做的最佳方法是什么?我不知道我可以使用Array.indexOf,因为我不知道如何将该对象传递给函数,我会尝试循环数组(约40条)并比较每个对象。

+0

您将不得不遍历数组并检查每个对象,然后在找到它时停止。 – 2013-05-02 13:47:12

回答

2

可以使用Array.some方法:

测试阵列中的一些元件是否通过由提供的功能来实现的测试。

那么你的代码看起来是这样的:

var isFound = availableTags.some(function(el) { 
    return el.label === 'Yoga classes'; 
}); 

注:some方法需要进行匀。

+0

您必须在阵列中的每个obj上运行该测试,直到找到肯定的情况 - perf会很差,特别是在较大的阵列上。 – Joshua 2013-05-02 14:16:01

+0

但它是一个非常优雅的:)同意性能问题。 40个参赛作品不是很多,所以我认为我可以忍受这一点。 – faboolous 2013-05-02 14:27:05

+2

'some'不会检查所有的对象,只有在回调返回true时。 – dfsq 2013-05-02 14:29:11

3

您需要遍历availableTags中的每个项目并检查该项目的label是否等于某个输入。尝试是这样的:

var input = "Yoga classes"; 
var found = false; 
for (var i = 0, j = availableTags.length; i < j; i++) { 
    var cur = availableTags[i]; 
    if (cur.label === input) { 
     found = true; 
     break; 
    } 
} 
console.log(found); 

DEMO:http://jsfiddle.net/k4cp4/4/

如果这可以很容易地放入功能,如:

var checkMatch = (function() { 
    var availableTags = [ 
     { label: "Yoga classes", category: "EDUCATIONAL" }, 
     { label: "Cooking classes", category: "EDUCATIONAL" }, 
     { label: "Cheese tastings", category: "EDUCATIONAL" }, 
     { label: "Maker Workshops", category: "PRACTICAL" }, 
     { label: "Seminars", category: "PRACTICAL" } 
    ]; 

    return function (input) { 
     var found = false; 
     for (var i = 0, j = availableTags.length; i < j; i++) { 
      var cur = availableTags[i]; 
      if (cur.label === input) { 
       found = true; 
       break; 
      } 
     } 
     return found; 
    }; 
})(); 

DEMO:http://jsfiddle.net/k4cp4/5/

这检查完全匹配。所以,如果你想有一个不区分大小写的匹配,可以使用:

if (cur.label.toLowerCase() === input.toLowerCase()) { 

DEMO:http://jsfiddle.net/k4cp4/6/

如果你想看看是否有任何label小号含有输入,你可以使用indexOf像:

if (cur.label.indexOf(input) > -1) { 

DEMO:http://jsfiddle.net/k4cp4/7/

+0

我recant。循环是最快的。 Array.indexOf也执行一个循环,但它增加了类型检查和其他一些东西的额外开销。最新的Chrome似乎针对大型数组中的indexOf进行了优化,但该优化在所有浏览器中都不一致。 – Joshua 2013-05-02 16:13:47

1
var check = function(item) {  
    for(at in availableTags) { 
     if(item == availableTags[at].label) { 
      return true; 
     } 
    } 
    return false; 
} 


console.log(check("Yoga classes")); 
+0

这段代码应该具有良好的浏览器兼容性 – Serg 2013-10-04 09:29:54

相关问题