Javascript 循环通过多维对象
有没有一种更有效的方法可以像下面这样在结构中循环,而不是对每一层都执行for()Javascript 循环通过多维对象,javascript,sapui5,Javascript,Sapui5,有没有一种更有效的方法可以像下面这样在结构中循环,而不是对每一层都执行for() [{a:foo,b:[{a:bar},{a:bar}]},{a:bar,b:[]},...] 我需要过滤掉属性a包含特定数据的所有项目,如果属性b包含一些元素,则也需要循环这些元素。 我曾想过使用filter方法,但似乎不知道如何有效地使用它。欢迎来到这里,这里收集了一些很棒的方法 var collection = [{a:foo,b:[{a:bar},{a:bar}]},{a:bar,b:[]},...];
[{a:foo,b:[{a:bar},{a:bar}]},{a:bar,b:[]},...]
我需要过滤掉属性a
包含特定数据的所有项目,如果属性b
包含一些元素,则也需要循环这些元素。
我曾想过使用filter方法,但似乎不知道如何有效地使用它。欢迎来到这里,这里收集了一些很棒的方法
var collection = [{a:foo,b:[{a:bar},{a:bar}]},{a:bar,b:[]},...];
var filteredCollection = _.chain(collection)
.flattenDeep()
.filter(function(item) { return item.a === 'foo'; });
比如说,这不是有效的代码,你需要做一些工作,使循环通过每一块来分别展平它们,我只是给你一些工具,让你更容易地完成这项工作。猜,我迟到了,但我还是会像这样做
function filter(obj){
if(obj.constructor === Array){
var arry = [];
obj.forEach(function(item){
var tmp = filter(obj);
if(tmp) arrypush(tmp);
});
return arry;
}
if(obj.a && obj.a.contains('ignore')) // modify this to your filter condition
return;
if(!ob.b || !obj.b.constructor === Array)
return obj;
var newObj={};
Object.keys(obj).forEach(function(key){
newObj[key] = obj[key];
});
newObj.b = filter(obj.b);
return newObj;
}
递归就是你所需要的。你建议只在一个级别上使用过滤器,而在其他级别上使用递归和循环处理吗?你必须明确你想要得到的结果。在上面的例子中,我有多维对象数组,我想过滤掉所有具有特定字符串值属性的对象。搜索功能。您好,谢谢。我限制了第三方库的使用,但
flattedeep()
给了我澄清,我必须使用哈希表,将所有元素存储在一个级别中。函数式编程是处理此类情况的一种难以置信的工具,但也是一种新的困难思维方式。如果您对更多功能性编程感兴趣,可以在一个很棒的地方看到来自netflix的技术领先者Jafar Husain的更多内容-