如何使用每个对象的所有属性来过滤对象数组以检查匹配?

时间:2017-03-05 01:36:04

标签: javascript

给定搜索字符串:

[ { name: 'Jane Smith', address: '123 Main St, Boston, MA 01234', telephone: { primary: '1234567890', secondary: '1112223333' } }, { name: 'John Smith', address: '333 Main St, New York, NY 56789', telephone: { primary: '2223334444', secondary: '3334445555' } }, ... ]

和这个对象数组:

arr.filter(person => person.name.includes(search))

我们可以按名称过滤数组:

name

大。如果我们只搜索每个对象的arr.filter(person => person.name.includes(search) || person.address.includes(search) || person.telephone.primary.includes(search) || person.telephone.secondary.includes(search) ) 属性,那么这很有效。

跨对象的所有属性进行过滤的最佳做法是什么?

我们必须做以下事情:

.filter(person => {
  for (let property in person) {
    return String(person[property]).includes(search)
  }
})

如果有多个属性,这将变得乏味且容易出错。

如果任何属性的值与搜索字符串匹配,有没有办法过滤数组?

更新

这适用于person对象的顶级属性。

UNION ALL

努力寻找一个很好的解决方案来递归搜索可能本身就是对象的属性。

3 个答案:

答案 0 :(得分:1)

在递归函数(我称之为class Cipher(): def __init__(self, key=bytearray(b'abc123y;')): self.setKeys(key) def setKeys(self, key): if isinstance(key, bytearray) and len(key) >= 8: self.encrKey = key[:8] self.decrKey = self.encrKey self.decrKey.reverse() print("Encrypt: ", self.encrKey) print("Decrypt: ", self.decrKey) return True else: return False In [13]: cipher = Cipher() Encrypt: bytearray(b';y321cba') Encrypt: bytearray(b';y321cba') In [14]: cipher.decrKey.reverse() In [15]: cipher.decrKey Out[15]: bytearray(b'abc123y;') )中使用Object.keysArray#some来检查是否有任何属性(或子属性)包含搜索字符串。在这里,我使用了deepIncludes来存储搜索字符串,因为这样您就可以使用以下语法this使用您的数组:

filter

let result = array.filter(deepIncludes, 'Search String')

答案 1 :(得分:1)

您可以将JSON.stringifyreplacer参数一起用作遍历对象的方法。

function search(obj, str) {
  var found = false;

  JSON.stringify(obj, (key, value) => {
    if (!found && typeof value === 'string' && value.includes(str)) found = true;
    else return value;
  });

  return found;
}

答案 2 :(得分:0)

最后我选择了接近这个的东西:

function search (obj, text) {
  for (let prop in obj) {
    if (String(obj[prop]).includes(text)) {
      return true
    } else if (typeof obj[prop] === 'object') {
      return search(obj[prop], text)
    }
  }
}

用法:

.filter(person => search(person, text))

<强>更新

for...in方法对我的用例不起作用。我不确定为什么,但是没有搜索到某些键。

使用Object.keys方法非常有效。

function search (obj, text) {
  return Object.keys(obj).some(k => 
    typeof obj[k] === 'object'
      ? search(obj[k], text)
      : String(obj[k]).includes(text)
  )
}

(相同用法)