扫描不同父级的JSON数据

时间:2017-06-28 10:46:38

标签: javascript json node.js

我有一个外部JSON文件并将其短语到一个本地对象数组,其结构类似于以下代码

{
  "post": {
     "sample": {
       "state": "neutral"
     },
     "demo": {
       "state": "positive"
     }
  }
}

如何在所有父级中获取state的所有值并将其保存(保存到数组中)或将其打印出来(console.log

我希望得到["neutral", "positive"]

这样的结果

Node.js或JS解决方案都欢迎

2 个答案:

答案 0 :(得分:5)

您可以使用迭代和递归方法迭代所有属性并检查一个键是否为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));

对于动态键的变量使用,您可以使用另一个参数。这意味着,您需要为每次重复呼叫插入密钥。

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));

答案 1 :(得分:1)

如果您的json结构始终相同,则可以使用以下代码段

let obj = {
  "post": {
     "sample": {
       "state": "neutral"
     },
     "demo": {
       "state": "positive"
     }
  }
};

for(let p in obj.post){
   console.log(obj.post[p].state)
}