【问题标题】:How do I combine keys from an array of elements and assign it to an object? [duplicate]如何组合元素数组中的键并将其分配给对象? [复制]
【发布时间】:2020-10-10 06:45:39
【问题描述】:

我有一个键数组

例如:var keyarray = [k1, k2, k3, ... ,kn];

设 o 为对象;

我需要检查 o[k1][k2][k3]...[kn] 的值

我尝试了以下方法:

方法一:

  1. 将 keyArray 的每个元素转换为数组,以便得到以下输出 var keyarray = [[k1], [k2], [k3], .... ,[kn]]
  2. 然后执行keyarray.join(''); --> 这会产生一个字符串,例如 k1k2k3...kn

方法二:

  1. 将 keyArray 的每个元素转换为数组,以便得到以下输出 var keyarray = [[k1], [k2], [k3], .... ,[kn]]
  2. 循环遍历 keyarray 并将每个值附加到一个字符串中,这样我就得到了以下输出 s = "[k1][k2][k3]...[kn]"
  3. 然后尝试 o[s] --> 返回未定义。

寻找任何建议。

编辑:添加实时示例以便正确理解。

我有如下 JSON 对象

obj = {
  "history": [
    {
     "at": "someval",
     "by": "someval"
    }.
    {
     "at": "someval",
     "by": "someval"
    }  
  ]
 }

对于以上内容,我将有一个如下所示的 keyArray

var keyArray = ["history", "0", "at"],

要访问它,我必须动态生成如下所示的对象

obj[history][0][at]

希望这会有所帮助。

【问题讨论】:

  • 为什么要将键包装在数组中?为什么要把他们联合起来?
  • 从 csv 导出中获取键,该导出以 history.0.at 等格式提供键。所以我将字符串拆分为一个数组,然后尝试访问该值。
  • 所以你已经有了路径。关于该设置有多个问题:通过路径访问属性

标签: javascript node.js arrays object


【解决方案1】:

您可以尝试使用 javascript reduce 方法:

keyarray.reduce((output, key, index, array) => {
  if(index !== array.length){
    return output[key];
  }else{
    return output;
  }
},o)

其中o 是初始对象。

【讨论】:

    【解决方案2】:

    据我了解,您拥有的对象是一个 深度 嵌套对象,而您拥有的数组描述了该嵌套中的路径。因此,如果找到它,这个方法将返回一些结果,给定键数组和对象(如果在这种深度嵌套的底部确实有一些“金罐”),但是,如果某个键是 在任何阶段都找不到undefined 将被退回。

    另外,可以有第三个测试用例,假设数组有 3 个键,但第二个键的值 不是 对象,而是一些原始(字符串、数字等)值本身.在这种情况下,将返回该值。如果我们在嵌套 不存在的情况下继续搜索键,则会引发错误。

    你可以试试这个:

    const nestedObj = {
        "k1": {
            "k2": {
                "k3": "POT_OF_GOLD"
            }
        }
    }
    
    const arrOfKeys = ["k1","k2","k3"];
    
    const secondArrOfKeys = ["k1","k4","k3"];
    
    const thirdArrOfKeys = ["k1","k2","k3","k4","k5"];
    
    //FIRST CASE - nesting is exactly as described in array of keys:
    const endResult = arrOfKeys.reduce((result,key) => {
      if(typeof(result)==='object'){
        result = result[key];
      }
      return result;
    },nestedObj);
    
    //SECOND CASE - some key in array not present in nesting
    const secondEndResult = secondArrOfKeys.reduce((result,key) => {
      if(typeof(result)==='object'){
        result = result[key];
      }
      return result;
    },nestedObj);
    
    //THIRD KEY - some key in array is not a nested obj, but a value itself
    const thirdEndResult = thirdArrOfKeys.reduce((result,key) => {
      if(typeof(result)==='object'){
        result = result[key];
      }
      return result;
    },nestedObj);
    
    
    console.log(endResult);
    
    console.log(secondEndResult);
    
    console.log(thirdEndResult);

    看看你的具体例子:

    const obj = {
      "history": [
        {
         "at": "I WANT THIS VAL",
         "by": "someval"
        },
        {
         "at": "someval",
         "by": "someval"
        }  
      ]
     }
     
     const path = "history.0.at";
     
     const getValAtNestedPath = (__obj,__path) => {
       return __path.split('.').reduce((result,pathVal) => {
         if(typeof(result)==="object"){
           result = result[pathVal];
         }
         return result;
       },__obj)
     }
     
     console.log(getValAtNestedPath(obj,path));

    【讨论】:

    • 请看一下编辑。这就是我现在面临的实时场景。
    • @BharatVk 请查看编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多