如何使用循环而不使用方法从对象获取值?

时间:2018-06-19 15:28:33

标签: javascript for-loop

通常需要从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是否存在,然后一次检查每个传递的属性是否未定义,如果通过所有这些检查,则最终获取值,否则返回未定义

2 个答案:

答案 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解释器会对其进行评估,如果键不提供,它将引发未定义的错误。已经存在...这有点违反了您要实现的目标。