JS搜索对象值

Emp*_*ger 43 javascript search json

我有一系列同类物体,如此;

[
  {
    "foo" : "bar",
    "bar" : "sit"
  },
  {
    "foo" : "lorem",
    "bar" : "ipsum"
  },
  {
    "foo" : "dolor",
    "bar" : "amet"
  }
]
Run Code Online (Sandbox Code Playgroud)

我想用关键字搜索这些对象的值(而不是键),并返回包含任何值中的关键字的对象数组.

因此,例如,使用关键字r,我将获得所有对象(对象#1中的"baR",对象#2中的"loRem"和对象#3中的"doloR").使用关键字lo,我会得到对象2和3("LOrem"和"doLOr")a,我会得到对象1和3,("bAr"和"Amet").foo但是使用关键字,我会得到一个空数组,因为"foo"是一个键,并且在任何值中都找不到(不像"bar")......你明白了.

我该怎么做呢?非常感谢提前!

tec*_*bar 53

像这样的东西:

var objects = [
  {
    "foo" : "bar",
    "bar" : "sit"
  },
  {
    "foo" : "lorem",
    "bar" : "ipsum"
  },
  {
    "foo" : "dolor",
    "bar" : "amet"
  }
];

var results = [];

var toSearch = "lo";

for(var i=0; i<objects.length; i++) {
  for(key in objects[i]) {
    if(objects[i][key].indexOf(toSearch)!=-1) {
      results.push(objects[i]);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

结果数组将包含所有匹配的对象.

如果你搜索'lo',结果将是:

[{ foo="lorem", bar="ipsum"}, { foo="dolor", bar="amet"}]
Run Code Online (Sandbox Code Playgroud)

新版本 - 添加了修剪代码,代码以确保结果集中没有重复项.

function trimString(s) {
  var l=0, r=s.length -1;
  while(l < s.length && s[l] == ' ') l++;
  while(r > l && s[r] == ' ') r-=1;
  return s.substring(l, r+1);
}

function compareObjects(o1, o2) {
  var k = '';
  for(k in o1) if(o1[k] != o2[k]) return false;
  for(k in o2) if(o1[k] != o2[k]) return false;
  return true;
}

function itemExists(haystack, needle) {
  for(var i=0; i<haystack.length; i++) if(compareObjects(haystack[i], needle)) return true;
  return false;
}

var objects = [
  {
    "foo" : "bar",
    "bar" : "sit"
  },
  {
    "foo" : "lorem",
    "bar" : "ipsum"
  },
  {
    "foo" : "dolor blor",
    "bar" : "amet blo"
  }
];

function searchFor(toSearch) {
  var results = [];
  toSearch = trimString(toSearch); // trim it
  for(var i=0; i<objects.length; i++) {
    for(var key in objects[i]) {
      if(objects[i][key].indexOf(toSearch)!=-1) {
        if(!itemExists(results, objects[i])) results.push(objects[i]);
      }
    }
  }
  return results;
}

console.log(searchFor('lo '));
Run Code Online (Sandbox Code Playgroud)

  • 编辑了for循环一点.现在,如果你将搜索设置为'lo',输出将是:[{foo ="lorem"},{foo ="dolor"}] (2认同)
  • 使它不区分大小写:在`searchFor(..)`函数内,替换行`if(objects [i] [key] .indexOf(toSearch)!= - 1){`with`if(objects [i] [key] .toLowerCase().indexOf(toSearch)!= - 1){`并替换行`toSearch = trimString(toSearch);`with`toSearch = trimString(toSearch).toLowerCase();` (2认同)

epa*_*llo 39

所有其他旧答案都使用for循环,现代JavaScript具有Object.keys.将它与some,includes和filter相结合,它更好一些.

var a = [{
  name: 'xyz',
  grade: 'x'
}, {
  name: 'yaya',
  grade: 'x'
}, {
  name: 'x',
  frade: 'd'
}, {
  name: 'a',
  grade: 'b'
}];

function filterIt(arr, searchKey) {
  return arr.filter(function(obj) {
    return Object.keys(obj).some(function(key) {
      return obj[key].includes(searchKey);
    })
  });
}

console.log("find 'x'", filterIt(a,"x"));
console.log("find 'a'", filterIt(a,"a"));
console.log("find 'z'", filterIt(a,"z"));
Run Code Online (Sandbox Code Playgroud)

或者使用ES6

function filterIt(arr, searchKey) {
  return arr.filter(obj => Object.keys(obj).some(key => obj[key].includes(searchKey)));
}
Run Code Online (Sandbox Code Playgroud)


Edi*_*ngo 10

这是现代 Javascript 的一种简洁方式:

var objects = [
  {
    "foo" : "bar",
    "bar" : "sit"
  },
  {
    "foo" : "lorem",
    "bar" : "ipsum"
  },
  {
    "foo" : "dolor blor",
    "bar" : "amet blo"
  }
];

const query = "lo";
const filteredItems = objects.filter(item => `${item.foo} ${item.bar}`.includes(query));
Run Code Online (Sandbox Code Playgroud)


vsy*_*ync 7

search函数将返回包含包含搜索查询的值的所有对象

function search(arr, s){
    var matches = [], i, key;
    
    for( i = arr.length; i--; )
        for( key in arr[i] )
            if( arr[i].hasOwnProperty(key) && arr[i][key].indexOf(s) > -1 )
                matches.push( arr[i] );  // <-- This can be changed to anything

    return matches;
};

// dummy data
var items = [
      {
        "foo" : "bar",
        "bar" : "sit"
      },
      {
        "foo" : "lorem",
        "bar" : "ipsum"
      },
      {
        "foo" : "dolor",
        "bar" : "amet"
      }
];
    
var result = search(items, 'lo'); // search "items" for a query value
console.log(result); // print the result
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 7

这是一个提议,它使用给定的键或对象的所有属性来搜索值。

function filter(array, value, key) {
    return array.filter(key
        ? a => a[key] === value
        : a => Object.keys(a).some(k => a[k] === value)
    );
}

var a = [{ name: 'xyz', grade: 'x' }, { name: 'yaya', grade: 'x' }, { name: 'x', frade: 'd' }, { name: 'a', grade: 'b' }];


console.log(filter(a, 'x'));
console.log(filter(a, 'x', 'name'));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)


Asa*_*af 6

现代 JavaScript

const objects = [
    {
        "foo" : "bar",
        "bar" : "sit"
    },
    {
        "foo" : "lorem",
        "bar" : "ipsum"
    },
    {
        "foo" : "dolor blor",
        "bar" : "amet blo"
    }
];

const keyword = 'o';

const results = objects.filter(object => Object.values(object).some(i => i.includes(keyword)));
console.log(results);

// results [{ foo: 'lorem', bar: 'ipsum' },{ foo: 'dolor blor', bar: 'amet blo' }]
Run Code Online (Sandbox Code Playgroud)


Gen*_*sco 5

这是一个很不错的解决方案

const array = [{"title":"tile hgfgfgfh"},{"title":"Wise cool"},{"title":"titlr DEytfd ftgftgfgtgtf gtftftft"},{"title":"This is the title"},{"title":"yeah this is cool"},{"title":"tile hfyf"},{"title":"tile ehey"}];

var item = array.filter(item=>item.title.toLowerCase().includes('this'));

 alert(JSON.stringify(item))
Run Code Online (Sandbox Code Playgroud)

已编辑

const array = [{"title":"tile hgfgfgfh"},{"title":"Wise cool"},{"title":"titlr DEytfd ftgftgfgtgtf gtftftft"},{"title":"This is the title"},{"title":"yeah this is cool"},{"title":"tile hfyf"},{"title":"tile ehey"}];

var item = array.filter(item=>item.title.toLowerCase().includes('this'));

 alert(JSON.stringify(item))
Run Code Online (Sandbox Code Playgroud)


小智 5

search(searchText) {
  let arrayOfMatchedObjects = arrayOfAllObjects.filter(object => {
    return JSON.stringify(object)
      .toString()
      .toLowerCase()
      .includes(searchText);
  });
  return arrayOfMatchedObjects;
}
Run Code Online (Sandbox Code Playgroud)

对于像我这样的人来说,这可能是非常简单、容易、快速且易于理解的搜索功能。