更好的实践:消除嵌套循环
Better Practices: Eliminate the nested loops?
我正在迭代一些对象,像这样(使用Underscore.js):
_.each(obj.Things, function(thing) {
_.each(thing.SubThings, function(subThing) {
_.each(subThing.SubSubThing, function(subSubThing) {
things.push(subSubThing);
});
});
});
我不喜欢它的外观,从架构上讲。有没有更干净的方法来完成这样的任务?
使代码更具可读性的一种方法是展开嵌套调用并仅使用常规函数调用。
_.each(obj.Things, processThing);
function processThing(thing) {
_.each(thing.SubThings, processSubThing);
}
function processSubThing(subThing) {
_.each(subThing.SubSubThing, processSubSubThing);
}
function processSubSubThin(subSubThing) {
things.push(subSubThing);
}
如果你使用ES6/ES2015,你可以使用箭头函数特性
let processThing = thing => _.each(thing.SubThings, processSubThing);
let processSubThing = subThing => _.each(subThing.SubSubThing, processSubSubThing);
let processSubSubThin = subSubThing => things.push(subSubThing);
_.each(obj.Things, processThing);
使用Array.prototype.map
和Array.prototype.reduce
,存在一个充分表达的解:
var things = obj.Things.map(function (thing) {
return thing.SubThings;
}).reduce(function (things, subthing) {
return things.concat(subthing.SubSubThings);
}, []);
所有对象都是Array吗?
那么,这有意义吗?
var things = _.flatten(_.map(obj.Things, function(thing) {
return _.pluck(thing.SubThings, "SubSubThings");
}));
如果你不想创造新的东西。
things.push(_.map(obj.Things, function(thing) {
return _.pluck(thing.SubThings, "SubSubThings");
}));
things = _.flatten(things);
相关文章:
- Knockout.js中带有if:子句的嵌套循环
- 有没有一种方法可以在所有嵌套循环之后放置一个标签,以便在一步中将它们全部打断
- JavaScript:在嵌套循环中为数组赋值
- Javascript嵌套循环匹配、组合、替换
- 在嵌套循环中处理 AJAX (Angularjs)
- knockout.js中的嵌套循环
- 在二维数组中搜索比嵌套循环更有效的方法
- 用于动态创建对象的嵌套循环
- 在javascript中嵌套循环
- JavaScript中的嵌入循环和嵌套循环之间有区别吗
- 嵌套循环中数组2d中的javascript变量丢失
- 嵌套循环javascript棋盘
- jQuery嵌套循环nextUntil选择器
- 如何使用嵌套循环使用 Javascript 打印到外部循环的输出中
- 如何在 Javascript 中创建一个模拟 100 行和 10 列网格的嵌套循环
- 如何避免嵌套循环
- 嵌套循环以添加数字
- 嵌套循环问题
- 嵌套循环,有更好的方法吗
- 更好的实践:消除嵌套循环