我在node.js中有以下json对象。
x={
'40': {
length: '2',
data: ['11', '22']
},
'41': {
length: '1',
data: ['fe']
},
'42': {
length: '2',
data: ['ef', 'ab']
},
}
假设我事先不知道x
内的属性名称是什么。但是,我想检索每个属性及其相关值。如何才能做到这一点?
我正在使用node.js
答案 0 :(得分:3)
首先,那不是JSON。这是一个JavaScript对象初始化程序。 JSON是文本表示法。如果您正在处理JavaScript源代码,而不是处理字符串,那么您就不会处理JSON。 (如果是一个字符串,那么它将是无效的JSON; JSON要求键和字符串是双引号,而不是单引号。)
您可以找出x
对象中的密钥使用for-in
或Object.keys
的内容:
for-in
var key;
for (key in x) {
// key is the key
// x[key] is the value
}
使用最新的NodeJS,您可以使用JavaScript的新let
来保持key
仅限于循环:
for (let key in x) {
// key is the key
// x[key] is the value
}
Object.keys
Object.keys(x).forEach(function(key) {
// key is the key
// x[key] is the value
});
在NodeJS的最新版本中,您可以使用JavaScript的新箭头功能作为callbck,以使事情更简洁:
Object.keys(x).forEach(key => {
// key is the key
// x[key] is the value
});
如果你需要进入x
所包含的对象,你只需要递归。
请注意,for-in
将访问对象的可枚举属性,包括其原型上的任何可枚举属性。 Object.keys
会为您提供一个对象拥有的可枚举属性(仅限)的数组。
forEach
的示例:
var x = {
'40': {
length: '2',
data: ['11', '22']
},
'41': {
length: '1',
data: ['fe']
},
'42': {
length: '2',
data: ['ef', 'ab']
},
};
Object.keys(x).forEach(function(key) {
snippet.log(key + ": length = " + x[key].length);
});

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
答案 1 :(得分:1)
使用递归来查找嵌套的所有对象的键/值:
function finder(obj) {
// for each property in the object passed into
// the function...
for (var p in obj) {
// if its value is another object (see appended note)...
if (Object.prototype.toString.call(obj[p]).slice(8, -1) === 'Object') {
// ...log the key to the console and then call finder()
// again with this current object (this is the recursive part)
console.log('key: ' + p + ', value: Object');
finder(obj[p]);
// otherwise log the key/value
} else {
console.log('key: ' + p + ', value: ', obj[p]);
}
}
}
finder(x);
输出
key: 40, value: Object
key: length, value: 2
key: data, value: Array [ "11", "22" ]
key: 41, value: Object
key: length, value: 1
key: data, value: Array [ "fe" ]
key: 42, value: Object
key: length, value: 2
key: data, value: Array [ "ef", "ab" ]
请注意
这个相当冗长的代码行来检查值是否为对象
Object.prototype.toString.call(obj[p]).slice(8, -1) === 'Object'
是必要的,因为typeof obj[p] === 'object'
将为数组和true
返回null
。这有点儿了。
Object.prototype.toString.call({})
返回类似"[object Object]"
的字符串,slice
抓取字符串的相关部分。
答案 2 :(得分:0)
您可以使用Object.keys()
:
Object.keys(x).forEach(v => {
console.log(v); // logs the key
console.log(x[v]) // logs the key's value
})
答案 3 :(得分:-1)
优化安迪的代码
var x = {
'40': {
length: '2',
data: ['11', '22']
},
'41': {
length: '1',
data: ['fe']
},
'42': {
length: '2',
data: ['ef', 'ab']
},
};
function finder(obj) {
if (Object.prototype.toString.call(obj).slice(8, -1) === 'Object') {
for (var p in obj) {
console.log('key: ' + p + ', type: object');
finder(obj[p]);
}
} else {
console.log('key: ' + obj + ', value: ', obj);
}
}
finder(x);
&#13;