将方法应用于匹配条件的JavaScript对象中的所有键

时间:2019-04-01 16:33:21

标签: javascript node.js json loops

我想将一个函数应用于JSON对象中具有与我的情况“ filename”相匹配的名称的所有方法。问题在于,文件名是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
        }
]

您能否提出有效的解决方案

2 个答案:

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

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

答案 1 :(得分:-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来改善这一点,但是它会变得更加复杂,这完全取决于您的集合包含多少个对象。