【问题标题】:Is it possible to search in javascript object with something like LIKE operator by string?是否可以使用类似 LIKE 运算符的字符串在 javascript 对象中进行搜索?
【发布时间】:2019-11-01 23:36:24
【问题描述】:

我有一个对象,我想通过一个字符串在其中搜索。对象中的数据包含我要更新该对象的字符串,因此结果中将只有包含该字符串的数据。

我试过这段代码:

let obj = {320936614713847: "Nibaru", 612610972204514: "Slevníme", 633965056629062: "Eye of wisdom"}

let matches = obj.filter(s => s.includes(document.getElementById('pageSearchBox').value));

console.log(matches);

【问题讨论】:

  • 您的预期输出是什么?什么是搜索字符串的示例(即:您会搜索“Nibaru”还是“320936614713847”)?

标签: javascript node.js javascript-objects


【解决方案1】:

.filter 不是一个方法,它是对象的一部分。因此obj.filter 是行不通的。但是,您可以改为将对象转换为值数组,这样您就可以使用.filter 排除与您的搜索查询不匹配的任何值。然后您可以使用.reduce() 将这个过滤后的键值数组重建为一个对象。

请看下面的例子:

let obj = {320936614713847: "Nibaru", 612610972204514: "Slevníme", 633965056629062: "Eye of wisdom"}
let searchStr = "Nib";
let matches = Object.entries(obj).filter(([_, v]) => v.includes(searchStr))
                    .reduce((acc, [k, v]) => ({...acc, [k]: v}), {})
console.log(matches);

【讨论】:

  • @DanielProgramátor 不用担心,很高兴为您提供帮助 :)
【解决方案2】:

你不能filter一个对象,你只能过滤一个列表。

知道了,你可以这样做:

let obj = {
    320936614713847: "Nibaru",
    612610972204514: "Slevníme",
    633965056629062: "Eye of wisdom"
}

let matches = Object
    .keys(obj)
    .filter(s =>
        obj[s] === document.getElementById('pageSearchBox').value
    );

console.log(matches);

如果你想按键过滤:

let obj = {
    320936614713847: "Nibaru",
    612610972204514: "Slevníme",
    633965056629062: "Eye of wisdom"
}

let matches = Object
    .values(obj)
    .filter(s =>
        s === document.getElementById('pageSearchBox').value
    );

console.log(matches);

【讨论】:

    【解决方案3】:

    对类似于 SQL 中的LIKE 的运算符使用正则表达式。

    您可以查看 sn-p 以获取示例。这将在对象中搜索与LIKE 子句'%iba%' 匹配的任何内容。

    let obj = {320936614713847: "Nibaru", 612610972204514: "Slevníme", 633965056629062: "Eye of wisdom"}
    
    let matches = []
    
    // Run thorugh object
    Object.keys(obj).forEach(kv => {
      if (/.*iba.*/.test(obj[kv])) { // ... LIKE '%iba%'
         matches.push(obj[kv]);
      }
    });
    
    
    console.log(matches);

    这就像 SQL 语句:

    SELECT val FROM obj WHERE val LIKE '%iba%';
    

    【讨论】:

      【解决方案4】:

      使用fromEntries:

       
      
      let obj = {320936614713847: "Nibaru", 612610972204514: "Slevníme", 633965056629062: "Eye of wisdom"}
      
      let matches = Object.fromEntries(Object.entries(obj).filter(([, v]) => v.includes("Nib")));
      
      console.log(matches);

      reduce 支持更好的版本:

       
      
      let obj = {320936614713847: "Nibaru", 612610972204514: "Slevníme", 633965056629062: "Eye of wisdom"}
      
      let matches = Object.entries(obj).filter(([, v]) => v.includes("Nib")).reduce((a, [k, v]) => (a[k] = v, a), {});
      
      console.log(matches);

      【讨论】:

        猜你喜欢
        • 2019-05-07
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 2018-11-02
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多