2017-03-20 47 views
-1

说我有以下的JSON文件返回基于价值JSON键名:是否有可能不知道密钥的名称

{"attributes": 
    { 
    "blue":true, 
    "red":false, 
    "green":true, 
    "webAtt": 
     { 
     "webColor": "#EF5689", 
     "webSafe":true 
     } 
    } 
} 

但让也说我不知道​​任何JSON节点除“属性”。我将如何去寻找哪些属性是真的?这甚至有可能吗?如果没有,是否必须对每个“属性”的子节点进行硬编码?

如果可能,我希望在JavaScript中完成此操作。

编辑:有一个原因,为什么webAtt在那里,因为我想在扫地时得到“websafe”,而不是“webAtt”。

+0

你JSON是无效的; '绿色'中的'{'会引发语法错误。我假设你只是想让对象变成绿色? –

+0

是的...我的坏...这只是我在飞行中制作的一个JSON示例,不是我现在需要的JavaScript ... – Midimistro

+0

请参阅已更新的JSON以获取正确的语法。 – Midimistro

回答

1

您可以循环使用做到这一点。

var json = {"attributes": 
 
    { 
 
    "blue":true, 
 
    "red":false, 
 
    "green":true, 
 
    "webAtt": 
 
     { 
 
     "webSafe":true, 
 
     "webcolor":"#EF5689" 
 
     } 
 
    } 
 
}; 
 

 
for (var k in json.attributes) { 
 
    if(json.attributes[k]==true){ 
 
     console.log(k + ' ' + json.attributes[k]); 
 
    } 
 
    if(whatIsIt(json.attributes[k])=="Object"){ 
 
     for(var l in json.attributes[k]){ 
 
      if(json.attributes[k][l]==true){ 
 
      console.log(l+' '+json.attributes[k][l]); 
 
      } 
 
     } 
 
    } 
 
} 
 

 

 
//See credit below snippet 
 
var stringConstructor = "test".constructor; 
 
var arrayConstructor = [].constructor; 
 
var objectConstructor = {}.constructor; 
 
function whatIsIt(object) { 
 
if (object === null) { 
 
    return "null"; 
 
} 
 
else if (object === undefined) { 
 
    return "undefined"; 
 
} 
 
else if (object.constructor === stringConstructor) { 
 
    return "String"; 
 
} 
 
else if (object.constructor === arrayConstructor) { 
 
    return "Array"; 
 
} 
 
else if (object.constructor === objectConstructor) { 
 
    return "Object"; 
 
} 
 
else { 
 
    return "don't know"; 
 
} 
 
}

信用为JSON对象类型标识符代码: How to check if JavaScript object is JSON

1

Object.keys()返回给定对象的枚举属性。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

所以你可以在上面的对象上做Object.keys(obj.attributes),它会返回["blue", "red", "green"]。然后,您可以应用过滤器来仅返回对象中的值为true的属性。

var obj = { 
 
    "attributes": { 
 
     "blue":true, 
 
     "red":false, 
 
     "green":true 
 
    } 
 
} 
 
console.log(Object.keys(obj.attributes).filter(function(attr) { return obj.attributes[attr] }))

+1

这很好,所有的,但我只需要返回蓝色和绿色,因为它们的值是真实的,红色不是 – Midimistro

+0

'Object.keys(obj.attributes).filter(function(attr){return obj.attributes [attr]} )'将返回键值为真的键 – Samuel

+0

这工作80%,除了不返回“websafe”,它返回“webattrib”,这不是我想要的。 – Midimistro

相关问题