代码之家  ›  专栏  ›  技术社区  ›  Majoris

如何使用Javascript在JSON中执行通配符关键字搜索?

  •  0
  • Majoris  · 技术社区  · 3 年前

    如何在JSON中执行关键字搜索? 我想从JSON中获取所有匹配的字符串键,而不是值。

    let json = {
        "first": {
            "first_fullname": 'abc',
            "first_address": '1 street name',
            "first_phone": 123456
        },
        "second": {
            "second_fullname": 'xyz',
            "second_address": '2 street name',
            "second_phone": 987654    
        }
    }
    
    
    var prop1 = 'first_address'
    var prop2 = 'address'
    
    Object.keys(json).forEach((person) => { 
        Object.keys(json[person]).forEach((attr) => { 
            if (prop1 in json[person]) {
                console.log(prop1)
            }
        })
    });
    
    Object.keys(json).forEach((person) => { 
        Object.keys(json[person]).forEach((attr) => { 
            if (prop2 in json[person]) {
                console.log(prop2)
            }
        })
    });

    应为包含的所有键字符串 *address* ,使用通配符。

    first_address
    second_address
    
    1 回复  |  直到 3 年前
        1
  •  2
  •   Nick SamSmith1986    3 年前

    我会把它写成一个函数,它接受属性和通配符标志,然后过滤每个的键 person 要查找与属性匹配的属性,请使用严格相等的值表示没有通配符或 String.includes 对于通配符:

    let json = {
      "first": {
        "first_fullname": 'abc',
        "first_address": '1 street name',
        "first_phone": 123456
      },
      "second": {
        "second_fullname": 'xyz',
        "second_address": '2 street name',
        "second_phone": 987654
      }
    }
    
    
    var prop1 = 'first_address'
    var prop2 = 'address'
    
    const hasProp = (json, prop, wildcard) =>
      Object.values(json)
      .flatMap(person => Object.keys(person)
        .filter(key => wildcard ? key.includes(prop) : key === prop)
      )
    
    console.log(hasProp(json, prop1, false))
    console.log(hasProp(json, prop2, true))
    
    const findProp = (json, prop, wildcard) =>
      Object.values(json)
      .flatMap(person => Object.entries(person)
        .filter(([key, value]) => wildcard ? key.includes(prop) : key === prop)
        .map(([key, value]) => ({
          [key]: value
        }))
      )
    
    console.log(findProp(json, prop1, false))
    console.log(findProp(json, prop2, true))
    
    const findProp2 = (json, prop, wildcard) =>
      Object.values(json)
      .flatMap(person => Object.entries(person)
        .filter(([key, value]) => wildcard ? key.includes(prop) : key === prop)
      ).reduce((acc, [key, value]) => {
        acc[key] = value
        return acc
      }, {})
    
    
    console.log(findProp2(json, prop1, false))
    console.log(findProp2(json, prop2, true))