我想将一个函数应用于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
}
]
您能否提出有效的解决方案
答案 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
来改善这一点,但是它会变得更加复杂,这完全取决于您的集合包含多少个对象。