递归地单步执行 Javascript 对象
recursively stepping through a Javascript object
我正在尝试学习递归地逐步浏览javascript对象。 更具体地说,我正在为函数式 JavaScript 做递归问题,这在 nodeschool.io 上很好。 我的代码没有正确递归,我不知道为什么。
这是我到目前为止的代码:
module.exports = function getDependencies (tree) {
var arr = [];
function findKeys(branch) {
var branchHolder = [];
branchHolder = branchHolder.concat(Object.keys(branch));
//console.log(branchHolder);
var filtered = branchHolder.filter(function (value) {
return value !== 'name' && value !== 'version';
})
console.log(filtered);
filtered.forEach(function (twig) {
if (typeof branch[twig] === 'object' && twig === 'dependencies') {
//console.log(twig);
findKeys(branch[twig]);
} else {
//console.log(branch[twig]);
arr.push(twig + '@' + branch[twig].version);
//console.log(arr);
}
/*
//if (branch[twig]) {console.log(branch[twig])}
if (twig !== 'dependencies') {
arr.push(twig + '@' + branch[twig].version)
//console.log(arr)
} else if (typeof branch[twig] === 'object') {
//console.log(branch[twig]);
findKeys(branch[twig]);
}
*/
})
}
findKeys(tree);
return arr.sort();
}
由于某种原因,我的代码不起作用。 我测试了代码的裸骨版本,它似乎有效。
function traverse(o) {
if (typeof o === 'object') {
for (var key in o) {
console.log('key: ', key);
traverse(o[key]);
}
} else {
console.log(o);
}
}
a = {foo: 'bar', baz: 'quux', zot: [1, 2, 3, {some: 'hash'}]}
traverse(a)
有人可以告诉我这两个代码块之间有什么不同吗?
提前谢谢你。 :)
安德鲁
仔细查看递归if
的结构:
if (typeof branch[twig] === 'object' && twig === 'dependencies') {
findKeys(branch[twig]);
}
您循环访问对象的键,并且仅递归于作为对象的依赖项的键。然后,您只保存不符合此要求的内容。
现在看看数据的结构:
var loremIpsum = {
"name": "lorem-ipsum",
"version": "0.1.1",
"dependencies": {
"optimist": {
"version": "0.3.7",
"dependencies": {
"wordwrap": {
"version": "0.0.2"
}
}
},
"inflection": {
"version": "1.2.6"
}
}
}
顶级对象有三个键:名称、版本和依赖项。筛选出名称和版本,并在依赖项上递归。伟大!现在,递归对象如下所示:
{
"optimist": {
version": "0.3.7",
"dependencies": {
"wordwrap": {
"version": "0.0.2"
}
}
},
"inflection": {
"version": "1.2.6"
}
}
所以你保存了乐观主义者和拐点的名称和版本......但是你不要递归!因为这里的键是"乐观"和"拐点",而不是"依赖"。
这里的核心问题是,当您的递归对象具有"依赖"键时,您希望递归,但您没有足够深入地研究。似乎您对每个点上各种递归对象的确切结构感到有些困惑。
你可能想要一个看起来更像这样的递归案例:
if (typeof branch[twig] === 'object') {
arr.push(twig + '@' + branch[twig].version);
if (branch[twig].dependencies) {
findKeys(branch[twig].dependencies);
}
}
function getDependencies(tree) {
var arr = [];
function findKeys(branch) {
var branches = Object.keys(branch).filter(function(value) {
return value !== 'name' && value !== 'version';
})
branches.forEach(function(twig) {
if (typeof branch[twig] === 'object') {
arr.push(twig + '@' + branch[twig].version);
if (branch[twig].dependencies) {
findKeys(branch[twig].dependencies);
}
}
})
}
findKeys(tree);
return arr.sort();
}
var loremIpsum = {
"name": "lorem-ipsum",
"version": "0.1.1",
"dependencies": {
"optimist": {
"version": "0.3.7",
"dependencies": {
"wordwrap": {
"version": "0.0.2"
}
}
},
"inflection": {
"version": "1.2.6"
}
}
}
deps = getDependencies(loremIpsum.dependencies)
document.write(JSON.stringify(deps))
相关文章:
- Chrome开发工具(如何知道我在调用哪个javascript对象)
- 循环遍历以数组为值的Javascript对象
- 从ajax请求中获取javascript对象
- 如何从对象的原型方法访问JavaScript对象属性
- 将XML转换为普通的旧JavaScript对象
- 通过引用传递JavaScript对象
- javascript对象操作:根据指定条件选择属性
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 如何在异步函数中使用javascript对象
- 临时Javascript对象
- 如何在ASP中为用户控件添加Javascript对象网
- 使用数组向下搜索Javascript对象
- Rails将JavaScript对象存储到Model的有效方式
- JavaScript对象不是从原型链继承的
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- SetInterval在javascript对象中表现怪异
- Javascript 对象和 this 关键字
- 如何在不知道关键字的情况下访问javascript对象值
- 在 JavaScript 对象中设置要使用的运算符的属性
- 如何搜索JavaScript对象并更改值