将字符串数组作为属性访问器

时间:2019-03-06 15:02:32

标签: javascript performance

我想通过字符串数组访问对象来获取值。

静态示例:输入:['a','b','c']输出:function (t) { t.a.b.c; }

我想创建一个函数来解决任何数组的问题。

function (state) {
  let value = state;
  for (let i = 0; i < propNames.length; i++) {
    value = value[propNames[i]];
  }
  return value;
};

其他解决方案是由减速器生成的函数。

这些正在工作。我想知道是否还有其他我没想到的更快的解决方案。

您可以测试here的算法。有一个可以添加代码的地方。

1 个答案:

答案 0 :(得分:2)

一种快速的方法是遍历属性并顺序访问内部对象,您可以使用Array.reduce()或for循环来实现:

const get = (obj, props) => props.reduce((out, p) => out && out[p] || undefined, obj);

const obj = { a: { b: { c: 5 } } };

console.log(get(obj, ['a', 'b', 'c']));
console.log(get(obj, ['a', 'b', 'c', 'd', 'e']));

或者,您可以使用eval()来评估表达式,但是,这可能是最慢的表达方式,我不推荐它

const get = (obj, props) => {
  try {
    return eval(`obj.${props.join('.')}`);
  } catch {
    return undefined;
  }
}

const obj = { a: { b: { c: 5 } } };

console.log(get(obj, ['a', 'b', 'c']));
console.log(get(obj, ['a', 'b', 'c', 'd', 'e']));