通常需要从javascript对象中获取值,而麻烦是当我尝试获取值或查看某些嵌套对象键是否有值时,我必须做类似的事情这个
// access deeply nested values...
obj['key1'] &&
obj['key1']['key2'] &&
obj['key1']['key2']['key3'] &&
obj['key1']['key2']['key3']['key4']
有很多在线解决方案,但是我发现所有这些方法都使用了一些初学者不了解的方法和概念,例如map / reduce方法或hasOwnProperty方法或其他方法。
是否可以使用简单的for循环来做到这一点?
function getValueAt(searchPath) {
for (i = 0; i < searchPath.length; i++) {
/* implementation */
}
return
}
数组是javascript对象,此辅助函数应支持搜索数组对象和非数组对象。
如果searchPath
不存在,则返回结果应该是不确定的;如果存在,返回值应该是值。
如何调用getValueAt
函数:
getValueAt(obj['key1']['key2']['key3']['key4'])
因此该函数应检查obj
是否存在,然后一次检查每个传递的属性是否未定义,如果通过所有这些检查,则最终获取值,否则返回未定义
答案 0 :(得分:1)
您可以将--where "id>=18689121 AND id<=19998441"
作为数组传递。遍历数组并分配值(如果存在)。如果不返回null
searchPath
您也可以使用function getValueAt(object, searchPath) {
for (var i = 0; i < searchPath.length; i++) {
if (object[searchPath[i]] !== undefined) object = object[searchPath[i]]; //If exist, assaign the value on variable o
else return null; //If does not exist, return null
}
return object;
}
var obj = {'k1': {'k2': {'k3': 'Test Value'}}};
var result = getValueAt(obj, ['k1', 'k2', 'k3']);
console.log(result);
代替for循环。
reduce
答案 1 :(得分:0)
这避免了通过递归使用本机方法。实现非常简单:
let obj = { key1: { key2: { key3: { key4: true } } }};
function getValueAt(o, keys, index = 0) {
const val = o[keys[index]];
return val === undefined || index + 1 === keys.length ?
val : getValueAt(val, keys, ++index);
}
console.log(getValueAt(obj, ['key1', 'key2', 'key3', 'key4'])); // true
console.log(getValueAt(obj, ['key1', 'key2', 'key3', 'key4', 'key5'])); // undefined
我不确定您为什么要声明时“避免使用方法”,但这通过在每次递归中仅更深地访问一个键来解决此问题。
同样重要的是要注意,不可能像您建议的那样将对象传递到函数中,例如getValueAt(obj['key1']['key2']['key3']['key4'])
,因为js解释器会对其进行评估,如果键不提供,它将引发未定义的错误。已经存在...这有点违反了您要实现的目标。