我有一个像这样的JavaScript对象:
[{
name : "soccer",
elems : [
{name : "FC Barcelona"},
{name : "Liverpool FC"}
]
},
{
name : "basketball",
elems : [
{name : "Dallas Mavericks"}
]
}]
现在我想在浏览器中搜索这个JavaScript对象。搜索“FC”应该给我这样的东西:
[
{name : "FC Barcelona"},
{name : "Liverpool FC"}
]
如何快速完成这项工作?这有没有JavaScript库?
答案 0 :(得分:13)
您可能喜欢使用jLinq(个人项目)
http://Hugoware.net/Projects/jLinq
像LINQ一样工作,但对于JSON,它允许您扩展它并根据需要修改它。已经有一堆预先构建的方法来检查值和范围。
答案 1 :(得分:8)
看起来好像唯一有用的答案是引用第三方库 - 这是您的本机JavaScript解决方案。对于那些只想要几行代码而不是堆栈的人来说:
功能:
Array.prototype.findValue = function(name, value){
var array = map(this, function(v,i){
var haystack = v[name];
var needle = new RegExp(value);
// check for string in haystack
// return the matched item if true, or null otherwise
return needle.test(haystack) ? v : null;
});
return array;
}
原生.map()
功能:
map = function(array, mapFunction) {
var newArray = new Array(array.length);
for(var i = 0; i < array.length; i++) {
newArray[i] = mapFunction(array[i]);
}
return newArray;
}
你的对象:
(从您发布的abject中略读):
myObject = {
name : "soccer",
elems : [
{name : "FC Barcelona"},
{name : "Liverpool FC"}
]
},
{
name : "basketball",
elems : [
{name : "Dallas Mavericks"}
]
}
用法:
(这将在myObject.elems数组中搜索匹配'FC'的'name')
var matched = myObject.elems.findValue('name', 'FC');
console.log(matched);
结果 - 检查你的控制台:
[Object, Object, findValue: function]
0: Object
name: "FC Barcelona"
__proto__: Object
1: Object
name: "Liverpool FC"
__proto__: Object
length: 2
__proto__: Array[0]
答案 2 :(得分:7)
虽然你可以用直接的JavaScript来做,underscore.js是一个很好的库来处理这些东西。你可能会用“pluck”和“each。”来实现它。
关于underscore.js的好处是它在存在时使用浏览器的内置调用。
答案 3 :(得分:4)
尝试jOrder。 http://github.com/danstocker/jorder
它针对JS中的大型(数千行)表的快速O(logn)搜索和排序进行了优化。
与数组迭代相反,jOrder使用索引来过滤数据,而这是大多数答案所依据的。只是为了给你一个想法,1000行表上的自由文本搜索比迭代快100倍。桌子越大,你得到的比率越高。
但是jOrder无法处理样本数据的格式。但如果你像这样重新格式化它:
var teams =
[
{ sport : "soccer", team: "FC Barcelona" },
{ sport : "soccer", team: "Liverpool FC" },
{ sport : "basketball", team : "Dallas Mavericks"}
]
首先设置一个jOrder表,您可以获得所需的结果:
var table = jOrder(teams)
.index('teams', ['team'], { grouped: true, ordered: true, type: jOrder.text });
然后对其进行搜索:
var hits = table.where([{ team: 'FC' }], { mode: jOrder.startof });
你将得到你需要的两行。就是这样。
答案 4 :(得分:0)
执行此操作的简单方法是迭代对象的每个属性并对其应用测试函数(在本例中为value.contains("FC")
)。
如果你希望它更快,你需要实现某种缓存(可以在任何查询之前在后台急切填充),或者可能预先计算各种流行测试函数的结果。
答案 5 :(得分:0)
您可以使用针对序列化JSON字符串执行的正则表达式执行此操作:
var jsonString = "[{ name : \"soccer\", elems : [ {name : \"FC Barcelona\"}"
+", {name : \"Liverpool FC\"}]},{name : \"basketball\",elems : ["
+"{name : \"Dallas Mavericks\"} ]}]";
var pattern = /\s*([\w\d_]+)\s*:\s*((\"[^\"]*(your pattern here)[^\"]*\")|(\'[^\']*(your pattern here)[^\']*\'))\s*/g;
var foundItems = [];
var match;
while(match = pattern.exec(jsonString)){
foundItems.push(match[0]);
}
var foundJSON = "[{" + foundItems.join("}, {") + "}]";
var foundArray = eval(foundJSON);
我还没有测试过这部分的循环部分,但正如我在firebug中进行简单测试一样,正则表达式对我来说效果很好。
答案 6 :(得分:-2)
关于AngularJS,您可以这样做:
var item = "scope-ng-model";
(angular.element('form[name="myForm"]').scope())[item] = newVal;