我目前有一个看起来像这样的对象:
{
"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'])
}
}
}
但是,似乎我没有做正确的事情,因为当我推入数组时会出现未定义或错误。有没有更简单/更有效的方法来完成此任务?任何帮助将不胜感激!
答案 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.values
和map
遍历两个级别的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);