在不知道名称的情况下访问 json 对象内的元素
Access elements inside json object without knowing names
我在 node.js 中有以下 json 对象。
x={
'40': {
length: '2',
data: ['11', '22']
},
'41': {
length: '1',
data: ['fe']
},
'42': {
length: '2',
data: ['ef', 'ab']
},
}
假设我事先不知道 x
中的 属性 名称是什么。但是,我想检索每个 属性 及其相关值。如何才能做到这一点?
我正在使用node.js
您可以使用 Object.keys()
:
Object.keys(x).forEach(v => {
console.log(v); // logs the key
console.log(x[v]) // logs the key's value
})
首先,那不是 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 的新 箭头函数 作为回调函数,使事情变得更简洁:
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) {
console.log(key + ": length = " + x[key].length);
});
优化安迪的代码
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);
使用递归查找所有对象的 key/values 嵌套或其他:
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'
将 return true
用于数组,null
也是。这有点棘手。
Object.prototype.toString.call({})
return 是一个类似于 "[object Object]"
的字符串,slice
抓取字符串的相关部分。
我在 node.js 中有以下 json 对象。
x={
'40': {
length: '2',
data: ['11', '22']
},
'41': {
length: '1',
data: ['fe']
},
'42': {
length: '2',
data: ['ef', 'ab']
},
}
假设我事先不知道 x
中的 属性 名称是什么。但是,我想检索每个 属性 及其相关值。如何才能做到这一点?
我正在使用node.js
您可以使用 Object.keys()
:
Object.keys(x).forEach(v => {
console.log(v); // logs the key
console.log(x[v]) // logs the key's value
})
首先,那不是 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 的新 箭头函数 作为回调函数,使事情变得更简洁:
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) {
console.log(key + ": length = " + x[key].length);
});
优化安迪的代码
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);
使用递归查找所有对象的 key/values 嵌套或其他:
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'
将 return true
用于数组,null
也是。这有点棘手。
Object.prototype.toString.call({})
return 是一个类似于 "[object Object]"
的字符串,slice
抓取字符串的相关部分。