【问题标题】:Getting an object property value using a dotted string [duplicate]使用虚线字符串获取对象属性值[重复]
【发布时间】:2017-07-16 12:25:34
【问题描述】:

我正在尝试通过字符串访问对象属性。

我想做的是:

const data = {
    key: {
        subKey: 'value'
    }
};

const theString = 'key.subKey';

function accessPropFromString(obj, stringCall) {
    // I don't know what to put on here
}

console.log(accessPropFromString(data, theString)) // prints 'value'

我完全不知道如何做到这一点......

我怎样才能用 JavaScript 做这种事情?

【问题讨论】:

  • 你不是新来的。你知道例行公事。到目前为止,您尝试过什么?
  • 使用模板文字代替:const theString = `${key.subKey}`;
  • @trincot:如果有问题的值不是字符串怎么办?
  • @ScottSauyet,然后使用标签函数:((_, val) => val)`${data.key.subKey}`;

标签: javascript


【解决方案1】:

您可以分割路径并缩小对象。

const getValue = (object, path) => path.split('.').reduce((o, k) => (o || {})[k], object),
      data = { key: { subKey: 'value' } },
      theString = 'key.subKey';

console.log(getValue(data, theString));

【讨论】:

  • 我认为这与我们从单个字符串开始的情况一样好。存在一个 API 问题,即它不会处理名称包含 '.' 的属性,但这是问题所固有的。
  • @ScottSauyet,对,数组作为参数对于带点的字符串会更好。
  • 是的,当我在我的图书馆dealt with this 时,我很不情愿地带着一个数组。我喜欢这种字符串的简单性,但是反例太多了。
【解决方案2】:

这应该可行。假设,你有固定的格式。

function accessPropFromString(obj, stringCall) {
   var splitter =stringCall.split(".");
   return data[splitter[0]][splitter[1]];
}

Demo

【讨论】:

  • 你用另一个级别做什么?
  • 是的,不是很通用。
【解决方案3】:

查看 cmets 内联:

const data = {
    key: {
        subKey: 'value'
    }
};

const theString = 'key.subKey';

function accessPropFromString(obj, stringCall) {
    // Split the string into individual parts
    var parts = stringCall.split(".");
    
    // You can use strings to lookup properties on objects
    // if you use bracket notation, like this;
    // parts["key"]["subKey"]
    // So, parts[0] will be "key" and parts[1] will be "subKey"
    return obj[parts[0]][parts[1]];
}

console.log(accessPropFromString(data, theString)) // prints 'value'

【讨论】:

  • 增加关卡会发生什么?
  • @ScottSauyet 你是对的,它不能处理这个问题。我实际上只是在演示如何使用括号表示法来访问带有字符串的属性。顺便问一下,你好吗? ;)
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2017-08-09
  • 2020-06-20
相关资源
最近更新 更多