有一个像这样的嵌套对象:
var conversation = {
'John': {
1: 'Test message 1',
2: 'Test message 2',
'Reply': {
3: 'Test message 3',
4: 'Test message 4'
}
},
'Jack': {
5: 'Test message 5',
6: 'Test message 6'
}
};
我需要获取所有最终值,因此对于该示例,它是:
Test message 1
Test message 2
Test message 3
Test message 4
Test message 5
Test message 6
如何迭代对象? jQuery或JavaScript中是否有内置函数?
答案 0 :(得分:19)
你可以使用一些递归来检查被迭代的键是否是一个对象,然后打印:
function printValues(obj) {
for (var key in obj) {
if (typeof obj[key] === "object") {
printValues(obj[key]);
} else {
console.log(obj[key]);
}
}
}
printValues(conversation);
答案 1 :(得分:3)
jQuery有你可以使用的each函数,除了一些递归到你的对象之前,直到你得到你可以打印的东西。
var conversation = {
'John': {
1: 'Test message 1',
2: 'Test message 2',
'Reply': {
3: 'Test message 3',
4: 'Test message 4'
}
},
'Jack': {
5: 'Test message 5',
6: 'Test message 6'
}
};
function iterate(obj) {
if (typeof obj === 'string') {
$('#log').append((obj + '<br/>'));
}
if (typeof obj === 'object') {
$.each(obj, function(key, value) {
iterate(value);
});
}
}
iterate(conversation);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log"></div>
答案 2 :(得分:2)
更实用的方法:
const getObjectValues = (obj) => (obj && typeof obj === 'object')
? Object.values(obj).map(getObjectValues).flat()
: [obj]
这将返回一个可以打印的数组:
console.log(getObjectValues(conversation))
// ["Test message 1", "Test message 2", "Test message 3", "Test message 4", "Test message 5", "Test message 6"]
编辑:
如果Array.flat
在您的上下文中不可用,则可以这样写:
const getObjValues = (obj) => (obj && typeof obj === 'object')
? Object
.values(obj)
.map(getObjValues)
.reduce((a, b) => a.concat(b), [])
: [obj]