请用async 或 Q 优化以下的蚯蚓 | 金字塔 | callback hell。
发布于 10 年前 作者 think2011 4956 次浏览 最后一次编辑是 8 年前
    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,就是基本的循环嵌套.

回到顶部