是否可以使用像字符串一样的LIKE运算符在javascript对象中进行搜索?

时间:2019-06-19 09:14:23

标签: javascript node.js javascript-objects

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

我尝试了以下代码:

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);

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

您不能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);

答案 2 :(得分:0)

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

您可以查看示例片段。这将在对象中搜索与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%';

答案 3 :(得分:0)

使用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);