【问题标题】:Apply method to all keys in javascript object which match condition将方法应用于 javascript 对象中匹配条件的所有键
【发布时间】:2019-04-01 16:33:20
【问题描述】:

我想将一个函数应用于 JSON 对象中的所有方法,这些方法的名称与我的情况“文件名”中的条件匹配。问题是该文件名是 JSON 对象中的嵌套属性,它通常只是嵌套 1 级,但可能更多。我只考虑过 async.each 对象,只是查看该对象是否具有我想要的属性并运行我的函数,但这似乎效率不高。

一个示例对象是

"hello"{
      "name": "Distribution Board 5",
      "Filename": "helloworld.png",
      "id": "5",
      "location": "somewhere",
      "description": "something",
}
"test"{
      "testproperty": 123
      "anothertest": 456
}
"extra": [
        {
          "Filename": "image.png",
          "Tag": "It's just a square",
          "Deleted": false
        }
]

你能建议一个有效的解决问题的方法

【问题讨论】:

    标签: javascript node.js json loops


    【解决方案1】:

    const object = {
      hello: {
        name: 'Distribution Board 5',
        Filename: 'helloworld.png',
        id: '5',
        location: 'somewhere',
        description: 'something'
      },
      test: {
        testproperty: 123,
        anothertest: 456,
        nestedproperty: {
          mismatching: 'key',
          Filename: 'test.jpg'
        }
      },
      extra: [{
        Filename: 'image.png',
        Tag: 'It\'s just a square',
        Deleted: false
      }]
    }
    
    function walk(o, fn, key) {
      switch (typeof o) {
        case 'object':
          if (o) {
            Object.entries(o).forEach(
              ([key, value]) => walk(value, fn, key)
            )
            break
          }
        default:
          fn(key, o)
          break
      }
    }
    
    walk(object, (key, value) => {
      if (key === 'Filename') console.log(`Found ${value}`)
    })

    这是一个适用于 JSON 可序列化对象的 walk() 函数。回调函数fn可以执行你需要的逻辑。

    【讨论】:

      【解决方案2】:

      我认为这里不需要async.each。可以用这样的小代码来完成:

      const run = (obj) => Object.keys(obj).find(
          x => x === "Filename" 
              || typeof obj[x] === "object" 
              && obj[x]
              && run(obj[x])
      );
      
      run(YourObjectHere)
      

      它会简单地递归遍历所有键并检查其中一个是否为“文件名”。

      使用Object.keys(x).includes 可能会改善这种情况,但它会变得更加复杂,这完全取决于您的集合包含多少对象。

      【讨论】:

      • 感谢您的回复,但是当我使用我的设置运行此程序时,我收到“ RangeError:超出最大调用堆栈大小”。我在它上面运行的集合在美化 json 时总共有大约 206 行。此外,根据我的理解,如果有一个名为 filename 的属性,是否有办法找到文件名,然后将方法应用于它
      • 这将无限递归任何其键与Filename 不匹配的字符串值,这就是失败的原因。
      • 有没有办法让它不使节点应用程序崩溃。但是在我给它的集合中,肯定有一些属性被称为“文件名”
      • 有趣...我一定是打错了...抱歉,在发布之前没有运行这个 - 将很快编辑。编辑:是的,循环引用是个问题。
      • run({ foo: null, Filename: 'bar.png' })
      猜你喜欢
      • 2021-12-21
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2018-07-20
      • 1970-01-01
      • 2016-10-18
      • 2014-12-18
      相关资源
      最近更新 更多