【发布时间】:2020-12-14 14:23:58
【问题描述】:
我有一个看起来像这样的对象:
{
"id": 45745049
"seller": {
"first_name": "Sam",
"last_name": "Smith",
"email": "samsmith@smith.com",
"phone": {
"number": "1111-1111",
"verified": false
},
},
"order_items": [
{
"item": {
"id": "29239765",
"title": "item1",
"colors": [
"red",
"green",
"blue"
]
},
"quantity": 1,
"unit_price": 230,
},
{
"item": {
"id": "238457363",
"title": "item2",
"colors": [
"red"
]
},
"quantity": 2,
"unit_price": 110,
}
],
"date_created": "2020-08-03T12:17:25.000-04:00",
"date_last_updated": "2020-08-03T16:51:35.61Z"
}
我想要一个数组,其中包含对象中每个键对的值。
例如:
[
["id", 45745049],
["first_name", "Sam"],
.....,
["phone.number", "1111-1111"],
["phone.verified", false],
....etc
]
在那之前一切都好。问题是当一个属性是一个对象数组时。我想要的输出如下:
[
...,
["order_items1.item.id", 29239765],
["order_items1.item.colors1", "red"],
["order_items1.item.colors2", "green"],
...,
["order_items2.item.id", 238457363],
["order_items2.item.colors1", "red"],
...etc
]
所以它需要检查属性是否为数组,如果是则添加位置编号。
我知道我需要一个递归函数,但我不知道该怎么做。 这是我到现在为止得到的。
getObjectKeys = (obj) => {
let FieldName = "";
let FieldValue = "";
for(var prop in obj) {
FieldName += prop;
if(!(prop instanceof Array) && (typeof prop !== "object") && obj[prop]) {
FieldValue = obj[prop];
} else if(prop instanceof Array && prop.length !== 0){
prop.forEach((innerItem, i) => {
FieldName += `${i+1}.`;
// check if the inner item is an array or whatever an do it all again
// Dont know what to do here.
});
} else {
getObjectKeys(obj[prop]);
}
}
return [FieldName, FieldValue];
}
注意:我不想要空或空键。
如果有人可以帮助我,我将不胜感激。还是谢谢!
【问题讨论】:
-
你确定要
["order_items1.item.id", 29239765]吗?由于 key 内的点,这不是一个正确的数组。如果你例如从这个数组中创建一个console.log,这个键/值对不存在。只能通过arr["order_items1.item.id"]地址获取值。 -
@Sascha 是的,我知道。但我不想稍后访问该密钥。只需要作为字符串的键
标签: javascript arrays function object recursion