我正在尝试编写一个函数,该函数可对对象进行挖掘,直到其到达最后一个.value
或.content
属性。我写了这篇,对于我的一生,我不知道为什么会破裂。
var jscGetDeepest = function(obj) {
try {
console.info(Math.round(Math.random() * 10) + ' starting jscGetDeepest:', obj, obj.toString());
} catch(ignore) {}
while (obj && ('contents' in obj || 'value' in obj)) {
if ('contents' in obj) {
obj = obj.contents;
} else if ('value' in obj) {
obj = obj.value;
}
//console.info('loop jscGetDeepest:', obj.toString());
}
if (obj || obj === 0) {
obj = obj.toString();
}
console.info('finaled jscGetDeepest:', obj);
return obj;
}
最佳答案
当下一个迭代中的内部值不是对象时,就会发生此问题。在这种情况下,您会收到一条错误消息,因为in
操作数不能与基元一起使用。
要修复它,请尝试检查对象,然后再尝试深入。这是使用JSON.stringify
而不是toString
修复的稍有改进的版本(返回更好的对象本身而不用字符串化?):
var jscGetDeepest = function (obj) {
while (typeof obj === 'object' && obj !== null && ('contents' in obj || 'value' in obj)) {
if ('contents' in obj) {
obj = obj.contents;
} else if ('value' in obj) {
obj = obj.value;
}
}
if (typeof obj === 'object') {
obj = JSON.stringify(obj);
}
return obj;
}
alert( jscGetDeepest({value: {name: 2, contents: {name: 3, value: 23}}}) );
alert( jscGetDeepest({value: {name: 2, value: {name: 3, contents: {name: 4}}}}) );