计算JavaScript对象中的叶子数
我有一个错误对象,我想用下面的方法计算叶子的总数,我的对象如下 我尝试使用object.keys属性,但它只计算对象的直接子对象,而不计算嵌套值计算JavaScript对象中的叶子数,javascript,javascript-objects,Javascript,Javascript Objects,我有一个错误对象,我想用下面的方法计算叶子的总数,我的对象如下 我尝试使用object.keys属性,但它只计算对象的直接子对象,而不计算嵌套值 state = { driver: { user: { number: '1234', firstName: 'xyz', lastName: 'abc' }, kyc: { name: 'kyc1',
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非常感谢您的解决方案奏效了。非常感谢!