Javascript (递归)如何从具有嵌套对象和数组的对象中获取所有键/值对

Javascript (递归)如何从具有嵌套对象和数组的对象中获取所有键/值对,javascript,arrays,function,object,recursion,Javascript,Arrays,Function,Object,Recursion,我有一个像这样的对象: { "id": 45745049 "seller": { "first_name": "Sam", "last_name": "Smith", "email": "s

我有一个像这样的对象:

        {
            "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];
    
}
注意:我不想要空键或空键


如果有人能帮助我,我将非常感激。无论如何谢谢你

这与您要查找的内容非常相似。这是一种技巧

const getpath=(obj)=>
对象(obj)==obj
? Object.entries(obj).flatMap(([k,v])=>getpath(v).map(p=>[k,…p]))
: [[]]
常量路径=(ps)=>(obj)=>
ps.reduce((o,p)=>(o |{})[p],obj)
常数展平=(obj)=>
Object.fromEntries(getpath(obj).map(p=>p.join('.')、path(p)(obj)])
const input={id:45745049,卖方:{名:“萨姆”,姓:“史密斯”,电子邮件:samsmith@smith.com,电话:{号码:“1111-1111”,核实:假},订单项目:[{项目编号:{id:{29239765”,标题:“项目1”,颜色:[“红”、“绿”、“蓝”]},数量:1,单价:230},{项目编号:{id:“238457363”,标题:“项目2”,颜色:[“红”},数量:2,单价:110),创建日期:“2020-08-03T12:17:25.000-04:00”,最后更新日期:“2020-08-03T16:51:35.61Z”
console.log(展平(输入))

.as控制台包装{min height:100%!important;top:0}
是否确实要
[“order_items1.item.id”,29239765]
?这不是一个正确的数组,因为键中有点。例如,如果从该数组生成console.log,则不会显示该键/值对。您只能通过
arr[“order\u items1.item.id”]
@Sascha通过
arr[“order\u items1.item.id”]对其进行寻址来获取值是的,我知道。但是我不想以后再使用那把钥匙。只需要把钥匙当琴弦谢谢你!!我不完全理解代码,也许我需要做一些调整,但这正是我想要的(某种程度上)。我以后会更仔细地读它,因为我的头现在要爆炸了,哈哈。再次感谢你,你是个天才。