【问题标题】:How to create function where you pass object and key and get back value of nested object [duplicate]如何创建传递对象和键并获取嵌套对象值的函数[重复]
【发布时间】:2019-07-03 19:53:43
【问题描述】:

我有一个嵌套对象,我如何拥有传入对象和键并取回值的函数?

示例输入

object = {"a1":{"b1":"{"c1":"d1"}"}}
key = a1/b1/c1
object = {"x1":{"y1":"{"z1":"a1"}"}}
key = x1/y1/z1
value = a1

以下是我尝试过的,但它是错误的

var obj, traverse;

obj = {
  a1: {
    b1: c1,
    b1: d1
  },
  x1: {
    y1: z1,
    y1: a1
  }
};

traverse = function(node, path) {
  var pairs;
  if (!(pairs = _(node).pairs()).length) {
    return [
      {
        keys: path,
        value: node
      }
    ];
  } else {
    return [].concat.apply([], _(pairs).map(function(kv) {
      return traverse(kv[1], path.concat(kv[0]));
    }));
  }
};

console.log(traverse(obj, []));

【问题讨论】:

标签: javascript


【解决方案1】:

你可以试试 lodash _.get ,这种访问方式非常棒:

如果找不到路径,你也可以传入一个默认值。

var object = {"a1": { "b1": { "c1": "d1" }}};

console.log("Result at 'a1.b1.c1': ",_.get(object, 'a1.b1.c1'));
console.log("Result at 'a1.b1.nonexistent key': ",_.get(object, 'a1.b1.nonexistent', "default result"));

var object2 = {"x1":{"y1":{"z1":"a1"}}};
console.log("Result at 'x1.y1.z1': ",_.get(object2, 'x1.y1.z1'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

【讨论】:

  • 谢谢这是非常全面的。我需要阅读更多关于你建议的 loadstash 的信息。如果你不介意你能告诉我默认值是如何工作的吗?
  • 所以默认值就是找不到key/path时返回的值。如果您不提供默认值,则返回 undefined。 lodash 文档也有关于这个函数的一些很好的信息:lodash.com/docs/4.17.11#get!我发现它对于处理深度嵌套的对象非常有用。
【解决方案2】:
let obj = {
    a1: {
        b1: {
            nested: true
        },
    },
    x1: {
        y1: 'zl',
    }
};


function getObjectKeys(object, key) {
    // if you want another split key you can change this.
    const keys = key.split('.');
    let obj = object;
    for (let ikey of keys) {
        for (let [objKey, value] of Object.entries(obj)) {
            if(!keys.includes(objKey)) {
                continue;
            }
            obj = value;
        }
    }
    return obj;
}

console.log(getObjectKeys(obj, 'a1.b1.nested'));

console.log(getObjectKeys(obj, 'x1.y1'));
// even if there is another additional key
console.log(getObjectKeys(obj, 'x1.y1.nested'));

不使用任何库, 阅读更多关于Object.entries

【讨论】:

    【解决方案3】:

    如果您可以将键表示为数组,则可以使用 reduce 解决此问题:

    const obj = {"x1":{"y1":{"z1":"a1"}}}
    
    const keys = ['x1', 'y1', 'z1']
    
    
    const value = keys.reduce((acc,key)=>acc[key], obj)// "a1"
    

    作为接受键数组或'x1.y1.z1' 形式的字符串的函数,具有未定义值的后备:

    const getValueFromKeys = (obj, keys, defaultValue)=> (Array.isArray(keys)?keys:keys.split('.')).reduce((acc,key)=>acc[key] || defaultValue, obj)
    

    【讨论】:

    • 谢谢.. 我喜欢这种方法.. 如果在我的场景中我有 2 个对象和 2 个键,那么如何修改函数以给出相同的结果?
    • 对不起,我很困惑...您可以使用不同的输入两次调用getValueFromKeys 吗?
    • 好的,谢谢,是的!我在想也许有一种不同的方式可以同时获得两个输出
    • 所以它回答了这个问题? :-)
    • 它肯定回答了这个问题。我接受了另一个答案,因为它包含未定义值的后备。非常感谢您的帮助
    猜你喜欢
    • 2020-12-14
    • 2021-11-30
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2016-10-31
    • 1970-01-01
    相关资源
    最近更新 更多