计算JavaScript对象中的叶子数

计算JavaScript对象中的叶子数,javascript,javascript-objects,Javascript,Javascript Objects,我有一个错误对象,我想用下面的方法计算叶子的总数,我的对象如下 我尝试使用object.keys属性,但它只计算对象的直接子对象,而不计算嵌套值 state = { driver: { user: { number: '1234', firstName: 'xyz', lastName: 'abc' }, kyc: { name: 'kyc1',

我有一个错误对象,我想用下面的方法计算叶子的总数,我的对象如下

我尝试使用object.keys属性,但它只计算对象的直接子对象,而不计算嵌套值

state = {
    driver: {
        user: {
            number: '1234',
            firstName: 'xyz',
            lastName: 'abc'
        },
        kyc: {
            name: 'kyc1',
            idNumber: 'kyc2'
        },
        license: {
            idNumber: '1234',
            issuedOn: '1991-05-12',
            validTill: '1991-12-12'
        }
    },
    vehicle: {
        vin: '4567',
        registrationNumber: '4567',
        dateBought: '1954-09-12',
        contractValidity: '1954-12-12',
        departments: [1, 2],
        vehicleType: 2
    },
    owner: {
        user: {
            number: '1234',
            firstName: 'lml',
            lastName: 'pqr',
            dateOfBirth: '2068-11-26'
        },
        kyc: {
            name: 'kyc2',
            idNumber: 'kyc123'
        },
        bank: {
            ifscCode: '1234',
            bankName: 'bank1',
            branchName: 'branch1',
            accountNumber: '1234',
            accountHolderName: 'holder1'
        },
        license: {
            idNumber: '12345',
            issuedOn: '1997-12-12',
            validTill: '1997-12-12'
        },
        insurance: {
            idNumber: '1234',
            issuedOn: '2909-12-12',
            validTill: '2909-12-12'
        }
    },
    errors: {},
    isSubmitable: false
}

这完全取决于我们如何定义叶子,但类似的东西应该可以使用递归:

函数countlevesobj{ 返回Object.valuesobj.reducecount,v=>count+=typeofv==='Object'?countLeavesv:1,0; } let state={驾驶员:{用户:{号码:'1234',名字:'xyz',姓氏:'abc'},kyc:{姓名:'kyc1',识别号:'kyc2'},执照:{识别号:'1234',签发日期:'1991-05-12',有效期:'1991-12-12',车辆:{vin:'4567',注册号:'4567',购买日期:'1954-09-12',合同有效期:'1954-12-12',部门:[1,2],车辆类型:2},车主:{用户:{号码:{1234',名字:'lml',姓氏:'pqr',出生日期:'2068-11-26'},kyc:{姓名:'kyc2',ID号码:'kyc123'},银行:{ifscCode:'1234',银行名称:'bank1',分行名称:'branchName:'branch1',账号:'1234',账户持有人名称:'holder1',许可证:{idNumber:'12345',issuedOn:'1997-12-12',validTill:'1997-12-12'},保险:{idNumber:'1234',issuedOn:'2909-12-12',validTill:'2909-12-12'},错误:{},issuebmitable:false};
console.logNumber of leaves:,countLeavesstate;这取决于我们定义leaves的确切方式,但类似的方法应该可以使用递归:

函数countlevesobj{ 返回Object.valuesobj.reducecount,v=>count+=typeofv==='Object'?countLeavesv:1,0; } let state={驾驶员:{用户:{号码:'1234',名字:'xyz',姓氏:'abc'},kyc:{姓名:'kyc1',识别号:'kyc2'},执照:{识别号:'1234',签发日期:'1991-05-12',有效期:'1991-12-12',车辆:{vin:'4567',注册号:'4567',购买日期:'1954-09-12',合同有效期:'1954-12-12',部门:[1,2],车辆类型:2},车主:{用户:{号码:{1234',名字:'lml',姓氏:'pqr',出生日期:'2068-11-26'},kyc:{姓名:'kyc2',ID号码:'kyc123'},银行:{ifscCode:'1234',银行名称:'bank1',分行名称:'branchName:'branch1',账号:'1234',账户持有人名称:'holder1',许可证:{idNumber:'12345',issuedOn:'1997-12-12',validTill:'1997-12-12'},保险:{idNumber:'1234',issuedOn:'2909-12-12',validTill:'2909-12-12'},错误:{},issuebmitable:false};
console.logNumber of leaves:,countLeavesstate;您可以采用递归方法,对不是对象的每个值进行计数,但将数组作为单个叶进行计数,否则将获取对象的所有值并尝试计数:

const state={驾驶员:{用户:{号码:'1234',名字:'xyz',姓氏:'abc'},kyc:{姓名:'kyc1',识别号:'kyc2'},执照:{识别号:'1234',签发日期:'1991-05-12',有效期:'1991-12-12',车辆:{vin:'4567',注册号:'4567',购买日期:'1954-09-12',合同有效期:'1954-12-12',部门:[1,2],车辆类型:2},车主:{用户:{号码:{1234',名字:'lml',姓氏:'pqr',出生日期:'2068-11-26'},kyc:{姓名:'kyc2',ID号码:'kyc123'},银行:{ifscCode:'1234',银行名称:'bank1',分行名称:'branchName:'branch1',账号:'1234',账户持有人名称:'holder1',许可证:{idNumber:'12345',issuedOn:'1997-12-12',validTill:'1997-12-12'},保险:{idNumber:'1234',issuedOn:'2909-12-12',validTill:'2909-12-12'},错误:{},issuebmitable:false} 函数countlevesval{ 如果typeof val!==object | | Array.isArrayval{ 返回1; } 返回Object.valuesval.mapcountLeaves.reducesum,0 } 常数和=a,b=>a+b;
console.logcountLeavesstate;您可以采用递归方法,对不是对象的每个值进行计数,但将数组作为单个叶进行计数,否则将获取对象的所有值并尝试对其进行计数:

const state={驾驶员:{用户:{号码:'1234',名字:'xyz',姓氏:'abc'},kyc:{姓名:'kyc1',识别号:'kyc2'},执照:{识别号:'1234',签发日期:'1991-05-12',有效期:'1991-12-12',车辆:{vin:'4567',注册号:'4567',购买日期:'1954-09-12',合同有效期:'1954-12-12',部门:[1,2],车辆类型:2},车主:{用户:{号码:{1234',名字:'lml',姓氏:'pqr',出生日期:'2068-11-26'},kyc:{姓名:'kyc2',ID号码:'kyc123'},银行:{ifscCode:'1234',银行名称:'bank1',分行名称:'branchName:'branch1',账号:'1234',账户持有人名称:'holder1',许可证:{idNumber:'12345',issuedOn:'1997-12-12',validTill:'1997-12-12'},保险:{idNumber:'1234',issuedOn:'2909-12-12',validTill:'2909-12-12'},错误:{},issuebmitable:false} 函数countlevesval{ 如果typeof val!==object | | Array.isArrayval{ 返回1; } 返回Object.valuesval.mapcountLeaves.reducesum,0 } 常数和=a,b=>a+b; console.logcountLeavesstate;让num=0; const objectLength=obj=>{ 对于let[key,va Object.entriesobj的lue]{ 如果typeof值==“对象”{ num++; 对象长度值; }否则,如果obj.hasOwnPropertykey{ num++; } } } 这将统计所有元素,甚至是嵌套的元素

设num=0; const objectLength=obj=>{ 对于Object.entriesobj的let[key,value]{ 如果typeof值==“对象”{ num++; 对象长度值; }否则,如果obj.hasOwnPropertykey{ num++; } } }
这将统计所有元素,甚至是嵌套的元素

你能包括一个尝试,以便我能更好地理解你想做什么吗?你认为数组是一个值还是多个值?@ VLAZ,一个数组永远不会是子对象。这是一个基本数据类型的嵌套对象扫描您是否包含一个尝试,以便我能更好地理解您正在尝试做什么?你认为数组是一个值还是多个值?@ VLAZ,一个数组永远不会是子对象。因此,它是一个基本数据类型为的嵌套对象,必须向上-您的解决方案返回33,而我的解决方案返回32。老实说,我不知道哪一个是正确的,但由于我们做的基本相同,不同之处在于您的解决方案将数组中的每个成员计算为一个叶。我不确定这是否是OP的意图,但至少可以证明这两种方法都是可行的。再想一想,如果我们有一个对象数组,每个对象都有自己的对象树,那么这可能会增加叶子的总数。但是,一个值数组不应该起作用。是的,这很棘手。不过OP还没有回来澄清。¯\_ツ_/“@VLAZ非常感谢您的解决方案奏效了。非常感谢!请注意,您的解决方案返回33,而我的解决方案返回32。老实说,我不知道哪一个是正确的,但由于我们做的基本相同,不同之处在于您的解决方案将数组中的每个成员计算为一个叶。我不确定这是否是OP的意图,但至少可以证明这两种方法都是可行的。再想一想,如果我们有一个对象数组,每个对象都有自己的对象树,那么这可能会增加叶子的总数。但是,一个值数组不应该起作用。是的,这很棘手。不过OP还没有回来澄清。¯\_ツ_/“@VLAZ非常感谢您的解决方案奏效了。非常感谢!