在javascript中生成深度对象中所有属性链的数组
Generating an array of all property chains in a deep object in javascript
大家好,读了很久了,但还是第一次发帖。在过去的几天里,我一直在尝试解决一个逻辑问题,但没有运气,希望有一个擅长递归逻辑的人能帮我。
基本上,我想生成一个数组,其中包含javascript中对象的所有嵌套属性的数组。例如:
{a:'b',c:{d:{e:'f',g:'h'}},i:'k'}
应返回
[['a'],['c','d','e'],['c','d','g'],['i']]
我尝试过用各种for/while循环进行递归,但在逻辑中迷失了方向:/
如有任何帮助,我们将不胜感激。如果有更好的方式来描述我的问题,请告诉我,我会更新这篇文章。
我的方法是编写递归的"chain builder",这样它就可以进行回调,这样回调就可以构建外部列表。
function findChains(obj) {
function chainFrom(chain, obj, atEnd) {
if (typeof obj !== 'object') atEnd(chain);
else {
for (var pn in obj) {
if (obj.hasOwnProperty(pn)) {
chain.push(pn);
chainFrom(chain, obj[pn], atEnd);
--chain.length;
}
}
}
}
var rv = [];
chainFrom([], obj, function(chain) {
rv.push(chain.slice(0));
});
return rv;
}
这可能有点过头了,回调可能只是硬编码的,而不是作为参数传入(和传递)。
有一种方法可以在一个函数中递归地执行,尽管我不确定这是否比上面的方法少一些。
var obj = {a:'b',c:{d:{e:'f',g:'h'}},i:'k'};
function dig(obj) {
var temp = [];
if (typeof obj == "object") {
for (var key in obj) {
var a = dig(obj[key]);
if (a.length !== 0) {
for (var i = 0; i < a.length; i++) {
a[i].unshift(key);
temp.push(a[i]);
}
} else {
temp.push([key]);
}
}
}
return temp;
}
var arr = dig(obj);
以下是jsfiddle中的一个工作示例,显示了arr
最终包含的内容:
http://jsfiddle.net/VZwaR/1/
无论关联数组有多深,它都应该工作得很好。
相关文章:
- 如何在不链接/jquery的情况下使用方法应用css属性数组
- 如何使用lodash返回与模式匹配的属性数组
- 从嵌套属性数组中获取对象嵌套值
- 如何使用 javascript 返回数据属性数组
- JQuery 获取返回的属性数组
- 对公共属性数组进行排序
- Angularjs-ng repeat不反映属性数组中的更改
- JADE&NodeJS访问JSON对象属性数组
- Lodash 按数组的属性数组过滤
- 将对象数组转换为属性数组
- 如何从一个共享属性的jQuery集合中获取一个属性数组
- 骨干移除和新视图不会重置其属性数组内容
- 使用JSON从对象数组创建属性数组
- 将数据属性数组转换为对象
- 从属性数组和匹配属性值数组创建JavaScript对象的有效方法
- 访问json中的属性数组
- jquery.获得没有重复的自定义属性数组
- 如何更新对象属性数组值
- 多属性数组语法
- jQuery:生成"name”;动态属性数组