ale*_*lex 13 javascript recursion
我正在构建一个实用程序函数,它应该搜索属性名称并在找到它后返回其值.它应该递归地执行此操作:
// Function
util.findVal = (object, propName) => {
for (let key in object) {
if (key === propName) {
console.log(propName)
console.log(object[key])
return object[key]
} else {
util.findVal(object[key], propName)
}
}
}
// Input
object: {
photo: {
progress: 20
}
}
// Usage
util.findVal(object, 'progress')
Run Code Online (Sandbox Code Playgroud)
然而,控制台日志永远存在,浏览器崩溃.我究竟做错了什么?
编辑:
这就是我调用函数的方式:
// Input
item: {
photo: {
file: {},
progress: 20
}
}
this.findProgress(item)
methods: {
findProgress (item) {
return util.findVal(item, this.propName)
}
}
Run Code Online (Sandbox Code Playgroud)
Nin*_*olz 21
你可以使用Object.keys和迭代Array#some.
function findVal(object, key) {
var value;
Object.keys(object).some(function(k) {
if (k === key) {
value = object[k];
return true;
}
if (object[k] && typeof object[k] === 'object') {
value = findVal(object[k], key);
return value !== undefined;
}
});
return value;
}
var object = { photo: { progress: 20 }};
console.log(findVal(object, 'progress'));Run Code Online (Sandbox Code Playgroud)
您的代码有一些错误:
util.findVal但不返回调用结果。代码应该是return util.findVal(...)key给递归调用第三个问题是什么会导致无限递归,例如:
var obj1 = {}, obj2 = {};
obj1.x = obj2; obj2.y = obj1;
Run Code Online (Sandbox Code Playgroud)
如果您只是继续寻找递归搜索,obj1否则obj2可能导致无限递归。
不幸的是,出于id(x)某种原因,我无法用Javascript弄清楚对象“身份” ...(Python 所做的事情),您只能将一个对象与另一个对象进行比较。这意味着要知道过去是否已经看到过某个对象,您需要对已知对象进行线性扫描。
ES6增加了使用
Set和Map在哪里可以将对象用作键来检查对象身份的可能性。这样可以加快(亚线性)搜索时间。
以深度顺序运行的搜索解决方案例如可以是:
function findVal(obj, key) {
var seen = new Set, active = [obj];
while (active.length) {
var new_active = [], found = [];
for (var i=0; i<active.length; i++) {
Object.keys(active[i]).forEach(function(k){
var x = active[i][k];
if (k === key) {
found.push(x);
} else if (x && typeof x === "object" &&
!seen.has(x)) {
seen.add(x);
new_active.push(x);
}
});
}
if (found.length) return found;
active = new_active;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
给定一个对象和一个属性名称,将在找到该名称的第一个深度处返回所有用该名称找到的值(可以有多个值:例如,当搜索{x:{z:1}, y:{z:2}}关键字时,"z"两个值位于相同的深度)。
该函数还正确处理自引用结构,从而避免了无限搜索。
小智 5
如果可以避免,请不要编写自己的实用程序。
使用类似jsonpath 的东西
支持的语法的一些示例:
JSONPath Description
$.store.book[*].author The authors of all books in the store
$..author All authors
$.store.* All things in store, which are some books and a red bicycle
$.store..price The price of everything in the store
$..book[2] The third book
$..book[(@.length-1)] The last book via script subscript
$..book[-1:] The last book via slice
$..book[0,1] The first two books via subscript union
$..book[:2] The first two books via subscript array slice
$..book[?(@.isbn)] Filter all books with isbn number
Run Code Online (Sandbox Code Playgroud)