【问题标题】:Get a value from an object dynamincally动态地从对象中获取值
【发布时间】:2020-10-21 22:12:12
【问题描述】:

我想将上下文从服务器传递到客户端,以便客户端更动态地在对象中获取值。

服务器传递一个带有值的对象,例如:"booking__validating_carrier__iata": "Cia"

booking__validating_carrier__iata 转换为数组['booking', 'validating_carrier', 'iata'],想法是得到order['booking']['validating_carrier']['iata']order.booking.validating_carrier.iata

有了这个,我想进入一个对象。我能想到的唯一方法是:

if(arr.length === 1) {
  order[arr[0]]
} else if(arr.length === 2) {
  order[arr[0]][arr[1]]
} else if(arr.length === 3) {
  order[arr[0]][arr[1]][arr[2]]
} else if(arr.length === 4) {
  order[arr[0]][arr[1]][arr[2]]
} else if(arr.length === 5) {
  order[arr[0]][arr[1]][arr[2]][arr[3]]
}

但是有没有办法循环遍历数组的长度以深入对象?

谢谢!

【问题讨论】:

  • 你可以用递归函数来做到这一点

标签: javascript arrays json for-loop object


【解决方案1】:

您可以使用order 作为initialValue 参数的reduce 数组。这将在每次迭代中将嵌套对象作为累加器

arr.reduce((acc, k) => acc[k] || {}, order)

这是一个sn-p:

const nested = {
  "1": {
    "1.1": {
      "1.1.1": "3 level nesting"
    },
    "1.2": "2 level nesting"
  }
}

const getValue = (order, arr) => arr.reduce((acc, k) => acc[k] || {}, order)

console.log( getValue(nested, ["1", "1.1", "1.1.1"]) )
console.log( getValue(nested, ["1", "1.2"]) )

【讨论】:

    【解决方案2】:

    您可以使用这样的递归函数来做到这一点。当数组没有更多的数据字段,或者对象没有更多与数组字段匹配的嵌套对象时,它将停止。

    const arr = ['booking', 'validating_carrier', 'iata'];
    
    const order = {
      booking: {
        validating_carrier: "test"
      }
    }
    
    const recFunc = (el, arr, i) => {
      if(arr[i] != undefined && el[arr[i]] != undefined) {
        return recFunc(el[arr[i]], arr, ++i);
      } else {
        return el;
      }
    }
    
    console.log(recFunc(order, arr, 0));

    如果这更符合你的风格,也可以使用 for 循环:

    const arr = ['booking', 'validating_carrier', 'iata'];
    
    const order = {
      booking: {
        validating_carrier: "test"
      }
    }
    
    let result = order;
    for(field of arr) {
      if(result[field] != undefined) {
        result = result[field];
      }
    }
    
    console.log(result);

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 2020-04-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多