【问题标题】:How can i search through nested javascript objects and return a key based on the values [closed]我如何搜索嵌套的javascript对象并根据值返回一个键[关闭]
【发布时间】:2021-07-13 05:39:45
【问题描述】:

所以我有一个结构与此类似的大对象:

var obj = {
      '1': {
        name: "Naruto Uzumaki",
        series: "Naruto"
      },
      '2': {
        name: "Sasuke Uchiha",
        series: "Naruto"
      },
      '3': {
        name: "Edward Elric",
        series: "Fullmetal Alchemist"
      },
      '4': {
        name: "Alphonse Elric",
        series: "Fullmetal Alchemist"
      }
    }

我想知道如何通过名称或系列进行搜索并返回响应的 ID。例如:

//I search for Fullmetal Alchemist it should return this:
['3', '4']

//I search for Naruto Uzumaki it returns
['1']

//I search for Elric it returns
['3', '4']

//And I search for Naruto it returns
['1', '2']

所以基本上我正在寻找一个搜索功能来查看所有嵌套对象。

我还想指出我在 nodejs 环境中执行此操作。

【问题讨论】:

标签: javascript node.js json


【解决方案1】:

试试这个代码

var obj = {
  1: {
    name: 'Naruto Uzumaki',
    series: 'Naruto',
  },
  2: {
    name: 'Sasuke Uchiha',
    series: 'Naruto',
  },
  3: {
    name: 'Edward Elric',
    series: 'Fullmetal Alchemist',
  },
  4: {
    name: 'Alphonse Elric',
    series: 'Fullmetal Alchemist',
  },
};

function searchByNameOrSeries(object, nameOrSeries) {
  const results = [];

  for (const property in object) {
    if (
      object[property].name.includes(nameOrSeries) ||
      object[property].series.includes(nameOrSeries)
    ) {
      results.push(property);
    }
  }

  return results;
}

console.log(searchByNameOrSeries(obj, 'Elric'));
console.log(searchByNameOrSeries(obj, 'Naruto'));

【讨论】:

    【解决方案2】:

    您可以使用Object.entries 将对象映射到 [key, value] 对数组。 然后您可以执行filter 和最后map 之类的数组操作来返回键数组而不是对象数组。

    要不只编写特定的搜索函数,您可以创建一个带有回调的函数,我在这里命名为 matcher - 这是一个匹配函数,将从数组中获取每个对象作为参数。

    var obj = {
          '1': {
            name: "Naruto Uzumaki",
            series: "Naruto"
          },
          '2': {
            name: "Sasuke Uchiha",
            series: "Naruto"
          },
          '3': {
            name: "Edward Elric",
            series: "Fullmetal Alchemist"
          },
          '4': {
            name: "Alphonse Elric",
            series: "Fullmetal Alchemist"
          }
        }
        
        function search(matcher) {
          return Object.entries(obj)
            .filter(([key, value]) => matcher(value))
            .map(([key]) => key)
        }
        
        console.log(
          search(value => value.series.match(value.series.match('Fullmetal Alchemist')))
        )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      相关资源
      最近更新 更多