我正在尝试编写一个挖掘对象的函数,直到它到达最后.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;
}
答案 0 :(得分:1)
当下一次迭代中的内部值不是对象时,会出现问题。在这种情况下,您会收到一条错误消息,因为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}}}}) );