Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
搜索JavaScript对象_Javascript - Fatal编程技术网

搜索JavaScript对象

搜索JavaScript对象,javascript,Javascript,我有一个JavaScript对象,如下所示: [{ name : "soccer", elems : [ {name : "FC Barcelona"}, {name : "Liverpool FC"} ] }, { name : "basketball", elems : [ {name : "Dallas Mavericks"} ] }] [ {name : "FC Barcelona"

我有一个JavaScript对象,如下所示:

[{
    name : "soccer",
    elems : [
        {name : "FC Barcelona"},
        {name : "Liverpool FC"}
    ]
},
{
    name : "basketball",
    elems : [
        {name : "Dallas Mavericks"}
    ]
}]
[
    {name : "FC Barcelona"},
    {name : "Liverpool FC"}
]
var teams =
[
{ sport : "soccer", team: "FC Barcelona" },
{ sport : "soccer", team: "Liverpool FC" },
{ sport : "basketball", team : "Dallas Mavericks"}
]
现在我想在浏览器中搜索这个JavaScript对象。搜索“FC”时,我会得到如下信息:

[{
    name : "soccer",
    elems : [
        {name : "FC Barcelona"},
        {name : "Liverpool FC"}
    ]
},
{
    name : "basketball",
    elems : [
        {name : "Dallas Mavericks"}
    ]
}]
[
    {name : "FC Barcelona"},
    {name : "Liverpool FC"}
]
var teams =
[
{ sport : "soccer", team: "FC Barcelona" },
{ sport : "soccer", team: "Liverpool FC" },
{ sport : "basketball", team : "Dallas Mavericks"}
]

如何快速做到这一点?这有JavaScript库吗

实现这一点的简单方法是迭代对象的每个属性并对其应用测试函数(在本例中,
value.contains(“FC”)


如果您想让它运行得更快,您可能需要实现某种缓存(可以在任何查询之前在后台进行填充),或者可能需要预先计算各种流行测试函数的结果。

您可能喜欢使用jLinq(个人项目)


与LINQ类似,但适用于JSON,它允许您根据需要扩展和修改它。已经有一系列预构建的方法来检查值和范围。

您可以使用针对序列化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中的简单测试对我来说似乎工作得很好。

试试jOrder

它针对JS中大型(数千行)表的快速O(logn)搜索和排序进行了优化

与数组迭代相反,这里的大多数答案都是基于数组迭代的,jOrder使用索引来过滤数据。为了给你们一个想法,在1000行表上的自由文本搜索完成速度比迭代快100倍左右。桌子越大,你得到的比例就越好

但是jOrder无法处理样本数据的格式。但如果您将其格式化为这样:

[{
    name : "soccer",
    elems : [
        {name : "FC Barcelona"},
        {name : "Liverpool FC"}
    ]
},
{
    name : "basketball",
    elems : [
        {name : "Dallas Mavericks"}
    ]
}]
[
    {name : "FC Barcelona"},
    {name : "Liverpool FC"}
]
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 });

您将得到所需的两行。就这样。

关于AngularJS,您可以这样做:

var item = "scope-ng-model";

(angular.element('form[name="myForm"]').scope())[item] = newVal;

看起来唯一有用的答案是引用第三方库——这是您的本机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 = function(array, mapFunction) {
      var newArray = new Array(array.length);
      for(var i = 0; i < array.length; i++) {
        newArray[i] = mapFunction(array[i]);
      }
      return newArray;
}
本机
.map()
函数:

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 = function(array, mapFunction) {
      var newArray = new Array(array.length);
      for(var i = 0; i < array.length; i++) {
        newArray[i] = mapFunction(array[i]);
      }
      return newArray;
}
使用方法:

(这将在myObject.elems数组中搜索与“FC”匹配的“name”)

结果-检查您的控制台:

[Object, Object, findValue: function]
0: Object
name: "FC Barcelona"
__proto__: Object
1: Object
name: "Liverpool FC"
__proto__: Object
length: 2
__proto__: Array[0]

什么是JSON对象?你是说你有一个JSON字符串?他当然有一个JavaScript对象。我假设他说是JSON,因为他向服务器索要JSON或JSONP我想跑得比O(n)快。我想了一些类似的东西,但如果没有必要,我不想自己写这些。@Juri,你愿意将对象预处理成不同的结构,还是想按原样使用对象?当然,从一种结构转换到另一种结构是有成本的。如果您要对同一数据进行大量搜索,这可能是值得的。@Nosredna:是的,预处理是绝对可能的。@Juri-根据定义,如果一个对象包含一些关于其他对象的信息,您只能比O(n)快;也就是说,给定在一个对象上运行测试函数的输出,您可以推断出至少一些其他对象的输出。此外,你为什么想要比O(n)更快的速度?您知道吗,对于大量对象,您需要良好的渐近性能?我怀疑您实际上没有。这只设置AngularJS范围对象的属性,它不搜索任何内容。这并没有解决op的问题。