访问另一个对象内的对象值

时间:2019-06-05 20:08:39

标签: javascript

我目前有一个看起来像这样的对象:

{
    "Best Fare Description": {
        "text": {
            "value": "One",
            "type": "TEXT"
        }
    },
    "Brand ID": {
        "text": {
            "value": "test",
            "type": "TEXT"
        }
    },
    "Program ID": {
        "text": {
            "value": "test",
            "type": "TEXT"
        }
    },
    "Max Elapse Time": {
        "integer": {
            "value": 4,
            "type": "INTEGER"
        }
    },
    "Max Number of Connections": {
        "integer": {
            "value": 5,
            "type": "INTEGER"
        }
    }
}

我试图遍历对象并创建仅包含值的数组。因此,对于该对象,我将返回

的数组
["One","test","test",4,5]

我尝试过的事情:

数据是对象

      const tempList = [];

      for (var key in data) {
        for (var key2 in data[key]) {
            for (var key3 in data[key][key2]) {
                tempList.push(key3['value'])
                }
            }
        }

但是,似乎我没有做正确的事情,因为当我推入数组时会出现未定义或错误。有没有更简单/更有效的方法来完成此任务?任何帮助将不胜感激!

5 个答案:

答案 0 :(得分:3)

由于使用了动态键,您可以获取值并映射最后一项。

var data = { "Best Fare Description": { text: { value: "One", type: "TEXT" } }, "Brand ID": { text: { value: "test", type: "TEXT" } }, "Program ID": { text: { value: "test", type: "TEXT" } }, "Max Elapse Time": { integer: { value: 4, type: "INTEGER" } }, "Max Number of Connections": { integer: { value: 5, type: "INTEGER" } } },
    result = Object.values(data).map(o => Object.values(o)[0].value);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

最简单的方法是使用Object.valuesmap遍历两个级别的reduce来构建数组:

let obj = {"Best Fare Description": {"text": {"value": "One","type": "TEXT"}},"Brand ID": {"text": {"value": "test","type": "TEXT"}},"Program ID": {"text": {"value": "test","type": "TEXT"}},"Max Elapse Time": {"integer": {"value": 4,"type": "INTEGER"}},"Max Number of Connections": {"integer": {"value": 5,"type": "INTEGER"}}}

let arr = Object.values(obj).reduce((arr, item) => {
  arr.push(...Object.values(item).map(inner => inner.value))
  return arr
}, [])
console.log(arr)

较新的javascript引擎可让您简化flatMap

let obj = {"Best Fare Description": {"text": {"value": "One","type": "TEXT"}},"Brand ID": {"text": {"value": "test","type": "TEXT"}},"Program ID": {"text": {"value": "test","type": "TEXT"}},"Max Elapse Time": {"integer": {"value": 4,"type": "INTEGER"}},"Max Number of Connections": {"integer": {"value": 5,"type": "INTEGER"}}}

let arr = Object.values(obj).flatMap(item => Object.values(item).map(inner => inner.value))
console.log(arr)

答案 2 :(得分:0)

似乎您最里面的对象的结构保持不变。在这种情况下,您可以稍微更改现有代码以执行以下操作:

const tempList = [];
for (let key in data) {
  for (let key2 in data[key]) {
    tempList.push(data[key][key2].value);
  }
}

答案 3 :(得分:0)

这是一个递归函数,它将满足您的需要(它将与任何形状的对象一起使用):

const findValues => obj => Object.keys(obj).reduce((acc,key)=>{
  if(key==='value'){
    acc.push(obj[key])
  }else if(typeof obj[key]==='object'){
    acc.push(findValues(obj[key]))
  }
  return acc.flat()
},[])

因此,如果您的对象是:

const obj = {
    "Best Fare Description": {
        "text": {
            "value": "One",
            "type": "TEXT"
        }
    },
    "Brand ID": {
        "text": {
            "value": "test",
            "type": "TEXT"
        }
    },
    "Program ID": {
        "text": {
            "value": "test",
            "type": "TEXT"
        }
    },
    "Max Elapse Time": {
        "integer": {
            "value": 4,
            "type": "INTEGER"
        }
    },
    "Max Number of Connections": {
        "integer": {
            "value": 5,
            "type": "INTEGER"
        }
    }
}

您会这样称呼它:

findValues(obj) // ["One", "test", "test", 4, 5]

更通用的版本:

const findValues = selector => obj => Object.keys(obj).reduce((acc,key)=>{
  debugger
  if(key===selector){
    acc.push(obj[key])
  }else if(typeof obj[key]==='object'){
    acc.push(findValues(selector)(obj[key]))
  }
  return acc.flat()
},[])

findValues('value')(obj) // ["One", "test", "test", 4, 5]

此处的Codepen:https://codepen.io/jenko3000/pen/yWWJxg

答案 4 :(得分:-1)

您说的是tempList.push(key3['value']),但是key3是字符串,而不是数组。您也不需要3个循环,只需2个循环。

let data = {
    "Best Fare Description": {
        "text": {
            "value": "One",
            "type": "TEXT"
        }
    },
    "Brand ID": {
        "text": {
            "value": "test",
            "type": "TEXT"
        }
    },
    "Program ID": {
        "text": {
            "value": "test",
            "type": "TEXT"
        }
    },
    "Max Elapse Time": {
        "integer": {
            "value": 4,
            "type": "INTEGER"
        }
    },
    "Max Number of Connections": {
        "integer": {
            "value": 5,
            "type": "INTEGER"
        }
    }
}

const tempList = [];

for (var key in data) {
  for (var key2 in data[key]) {
      if (data[key][key2]['value'])
        tempList.push(data[key][key2]['value'])
  }
}
  
  console.log(tempList);