我有一个外部JSON文件,并将其设置为具有以下代码结构的本地对象数组
{
"post": {
"sample": {
"state": "neutral"
},
"demo": {
"state": "positive"
}
}
}
我如何在所有父级中获取state
的所有值并将其保存(保存到数组)或打印出来(console.log
)我想要一个像
["neutral", "positive"]
的结果欢迎使用Node.js或JS解决方案
最佳答案
您可以使用迭代和递归的方法来迭代所有属性,并检查一个键是否为state
,然后收集值。如果该属性是一个对象,则从该属性中收集递归的状态。
function getStates(o) {
return Object.keys(o).reduce(function (r, k) {
if (o[k] && typeof o[k] === 'object') {
return r.concat(getStates(o[k]));
}
if (k === 'state') {
r.push(o.state);
}
return r;
}, []);
}
var object = { post: { sample: { state: "neutral" }, demo: { state: "positive" } } };
console.log(getStates(object));
对于动态键的可变使用,可以为其使用另一个参数。这意味着,您需要为每个重复的调用插入 key 。
function getStates(o, label) {
return Object.keys(o).reduce(function (r, k) {
if (o[k] && typeof o[k] === 'object') {
return r.concat(getStates(o[k], label));
// ^^^^^ call with label
}
if (k === label) {
r.push(o[label]);
}
return r;
}, []);
}
var object = { post: { sample: { state: "neutral" }, demo: { state: "positive" } } };
console.log(getStates(object, 'state'));
为了获取父对象,您可以存储该值的路径并将其作为值。
function getStates(o, p, q) {
p = p || [],
q = q || {};
Object.keys(o).forEach(function (k) {
var t = p.concat(k);
if (o[k] && typeof o[k] === 'object') {
getStates(o[k], t, q);
return;
}
q[o.state] = t.join('.');
});
return q;
}
var object = { post: { sample: { state: "neutral" }, demo: { state: "positive" } } };
console.log(getStates(object));