Javascript 如何从左到右显示对象的嵌套键?
我有一个目标Javascript 如何从左到右显示对象的嵌套键?,javascript,arrays,Javascript,Arrays,我有一个目标 var tree = { 17:{ 1:{ 3:{}, 4:{} }, 2:{ 5:{}, 6:{} }
var tree = {
17:{
1:{
3:{},
4:{}
},
2:{
5:{},
6:{}
}
}
};
如何按17、1、2、3、4、5、6的顺序显示按键
我尝试过这个功能:
var arr = [] ;
var arrObject = [] ;
function printValues(obj) {
for (var key in obj) {
arr.push(key);
if (typeof obj[key] === "object") {
arrObject.push(obj[key]);
printValues(obj[key]);
}
}
}
printValues(tree);
结果是17,1,3,42,5,6。
我需要17,1,2,3,4,5,6这是我的作品(更改):
常数树={
第一:{
1:{
3:{
7: 7,
8: 8,
},
4:{
9: 9,
10: 10,
}
},
2:{
5:{
20: {
30: 30,
},
21: {
31: 31,
}
},
6:{
22: 22,
}
},
},
};
常量键=[];
/**
*处理合并的值
*@param值
*/
函数handleData(值){
让子值={};
for(让输入值){
按键。按(键);
赋值(子值,句柄(值[键]);
}
//如果有值,则处理它们
if(Object.keys(subValues).length)handleData(subValues);
}
/**
*处理一个值
*@param值
*@returns{{}
*/
函数句柄(值){
if(Object.keys(value).length){
返回Object.assign({},value);
}
}
//处理我们的数据
handleData(树);
console.log(键);//[first',1,2,3,4,5,6,7,8,9,10,20,21,22,30,31]
下面使用递归函数提取与其在对象中的深度相关联的所有嵌套关键点。然后按深度对结果进行排序 请注意,该方法可能会在给定深度处更改键的顺序。为了演示这一点,我将示例中的
3
更改为99
。返回的结果包括“4”、“99”
,而不是“99”、“4”
。然而,正如@deceze在评论中指出的那样,对象中属性的顺序是未定义的,因此在给定对象深度内更改顺序不应该(希望)是一个问题。(如果是问题,则需要另一种方法,例如使用数组而不是对象。)
还要注意,下面的代码返回一个字符串数组。如果某些键是显式字符串(例如使用字母),这将特别合适。如果您确实希望结果是数字的,只需将+
添加到map
命令,即。映射(elmt=>+elmt[1])
const getKeysOrderedByDepth=obj=>{
设arr=[],level=0;
const getKeys=obj=>{
级别+=1;
用于(输入obj){
arr.push([电平,键]);
const val=obj[key];
获取密钥(obj[key]);
}
级别-=1;
};
获取密钥(obj);
返回arr.sort((a,b)=>a[0]-b[0]).map(elmt=>elmt[1]);
};
让树={
17: {
1: {
99: {},
4: {}
},
2: {
5: {},
6: {}
}
}
};
log(getKeysOrderedByDepth(树))
34
和56
??在它们上面循环,并将键按到阵列上,最后可以直接调用array.join()
。但这不会处理34,56
。为此,您将需要自定义处理。我们可以建议一些技巧,但为此我们需要查看您的代码可能的重复项,因为对象中属性的顺序未定义,因此无法保证它们会像这样显示,除非您对它们进行特别排序,您必须对此进行澄清。我更新了我的问题,我试图得到的结果是17,1,2,3,4,5,6;如果我添加另一个类似于此的常量树={17:{1:{3:{},4:{},2:{5:{7:7,8:8},6:{};因此它仍然显示[“17”、“1”、“2”、“3”、“4”、“5”、“6”];它需要有活力。从左到右逐级打印
const tree = {
first:{
1:{
3:{
7: 7,
8: 8,
},
4:{
9: 9,
10: 10,
}
},
2:{
5:{
20: {
30: 30,
},
21: {
31: 31,
}
},
6:{
22: 22,
}
},
},
};
const keys = [];
/**
* Handle merged values
* @param values
*/
function handleData(values) {
let subValues = {};
for (let key in values) {
keys.push(key);
Object.assign(subValues, handle(values[key]));
}
// If have values, handle them
if (Object.keys(subValues).length) handleData(subValues);
}
/**
* Handle one value
* @param value
* @returns {{}}
*/
function handle(value) {
if (Object.keys(value).length) {
return Object.assign({}, value);
}
}
// Handle our data
handleData(tree);
console.log(keys); // ['first',1,2,3,4,5,6,7,8,9,10,20,21,22,30,31]