请用async 或 Q 优化以下的蚯蚓 | 金字塔 | callback hell。 - CNode技术社区

请用async 或 Q 优化以下的蚯蚓 | 金字塔 | callback hell。
发布于 11 年前 作者 think2011 5627 次浏览 最后一次编辑是 9 年前
 var temp = [];
 for(var i=0; i <= data.length; i++) {
 temp.push({
 id : data[i].id,
 chk: data[i].chk === true ? '1' : '2'
 });
 for(var j=0; j <= data[i].children.length; j++) {
 temp.push({
 id : data[i].children[j].id,
 chk: data[i].children[j].chk === true ? '1' : '2'
 });
 for(var k=0; k <= data[i].children[j].children.length; k++) {
 temp.push({
 id : data[i].children[j].children[k].id,
 chk: data[i].children[j].children[k].chk === true ? '1' : '2'
 });
 }
 }
 }
14 回复

现在也就我这样的闲人来算算了

####工具util.js


// 提取流数据
function dataParse (stream, f) {
 var result = '';
 // 提取流数据块
 stream.on('data', 'utf8', function (data) {
 result += data;
 });
 // 通过f映射合并后的数据
 stream.on('end', function () {
 f(result);
 });
}
// 操作你的数据树
function compose (data) {
 var temp = [];
 // 递归遍历数据,并提取
 function walk (data) {
 // 当目标不再是数组的时候停止
 if (data instanceof Array) {
 data.forEach(function (item) {
 temp.push({ 
 id: item.id, 
 chk: item.chk === true ? '1' : '2' 
 });
 // 递归子数据
 walk(item.childen);
 });
 }
 }
 walk(data);
 return temp;
}
exports.dataParse = dataParse;
exports.compose = compose;

####主进程main.js


// 启动子进程
var child = require('child_process').spawn('node', ['compose.js']);
var data = [..............]; // 填入data数据
// 恢复子进程输出流数据流入
child.stdout.resume();
// 提取子进程输出流数据,并将结果解析为json对象(数组)
// 操作...
require('./util.js').dataParse(child.stdout, function (result) { 
 var obj = JSON.parse(result); 
 // any code...
});
// 向子进程写入数据树(字符串 )
// 由子进程接管递归遍历,并将结果返回主进程
child.stdin.write(JSON.stringify(data));

####计算进程compose.js


var util = require('./util.js');
// 恢复输入流数据流入
process.stdin.resume();
// 提取主进程输入流数据,并将结果解析为json对象(数组)
// compose操作数据树,将结果转换为字符串,发送回主进程
util.dataParse(process.stdin, function (result) { 
 process.stdout.write(JSON.stringify(util.compose(JSON.parse(result)))); 
});

@tulayang 没看懂哈~

callback都没有,还callback hell。

@tulayang 哈哈哈哈哈哈哈哈哈哈,兄弟真有闲情

递归都不会用,唉

用递归不是很简单的么,修改原程序 for(var i=0; i <= data.length; i++) 中 i<data.length , 小于代替小于等于,同j,k循环过程。

//递归函数
fun=function(data){
	for(var i=0; i < data.length; i++) {
		if(data[i].children.length>0){
			temp.push({
				id : data[i].id,
				chk: data[i].chk === true ? '1' : '2'
			});
			fun(data[i].children)
		}
	}
}
var data = [
 {"id": 1,"chk": true,"children": [
		{"id": 2,"chk": true,"children": [
			{"id": 3,"chk": false,"children": [
				{"id": 4,"chk": false,"children": []}							
			]},{"id": 5,"chk": true,"children": [
				{"id": 6,"chk": false,"children": []}					
			]}
		]},{"id": 7,"chk": true,"children": [
			{"id": 8,"chk": false,"children": [
				{"id": 9,"chk": false,"children": []}
			]}
		]}
 ]}
];
var temp = [];
fun(data);
console.log(temp);
//输出
[ { id: 1, chk: '1' },
 { id: 2, chk: '1' },
 { id: 3, chk: '2' },
 { id: 5, chk: '1' },
 { id: 7, chk: '1' },
 { id: 8, chk: '2' } ]

@JacksonTian 哈哈,你说的对!

@zensh 是的,我是新手。

@bsspirit 谢谢,后来我是用这种方式解决的。

@zensh 对了,很希望angularjs中文站能有搜索功能,什么时候有空升级一下好吗? 这会很有帮助。

var temp = []; function fun(data){ for(var i = 0, len = data.length; i < len; i++){ temp.push({ id : data[i].id, chk: data[i].chk === true ? ‘1’ : ‘2’ }); if(data[i].children){ fun(data[i].children) } } }

没有callback,就是基本的循环嵌套.

回到顶部

AltStyle によって変換されたページ (->オリジナル) /