文件对比 接上文

接上文链接 https://www.cnblogs.com/hill-foryou/p/10600315.html

当文件或文件夹对比时,可能出现以下情况,怎么对数组里的文件(一个object对象)对比呢

数组的话比较就得两个for循环 如果 1000个文件 两次循环后 就是1000* 1000 =100万次,非常浪费性能,如果文件少的话还可以。
怎么办?
想办法 那就把数组转为对象,key值为对比的文件名

 // 数组转对象 对比的文件夹或文件名字作为key值
 function arr_to_obj(data) {
    var len = data.length || 0;
    var obj = {};

    for (var i = 0; i < len; i++) {
        var item = data[i];
        obj[item.dir_name] = item;
        if (hasdirs(item)) {
            var item_dirs = item.dirs;
            var child_dict = arr_to_obj(item_dirs);
            item.dirs = child_dict;
        }

        if (hasfiles(item)) {
            var item_files = item.files;
            var files_len = item_files.length;
            var dict = {};
            for (var j = 0; j < files_len; j++) {
                var el = item_files[j];
                dict[el.file_name] = el;
            }
            item.files = dict;
        }
    }
    return obj;
 }
// 是文件夹
function is_folder(data) {
    return (data.hasOwnProperty('files') || data.hasOwnProperty('dirs'));
}
// 有文件
function hasfiles(data) {
    return data.hasOwnProperty('files');
}
// 有目录 
function hasdirs(data) {
    return data.hasOwnProperty('dirs');
}
//递归解析文件夹,文件
function
get_files(d1 = {}, d2 = {}, parent_name = '', _index, parent_path) { _index = _index || 0; _index++; var arr = []; for (var k1 in d1) { // d1,d2都存在 let item1 = d1[k1] || {}; let item2 = d2[k1] || {}; var cur_name = item1['dir_name'] + _index + Math.random().toString(32).slice(-6); if (is_folder(item1) || is_folder(item2)) { var obj = {}; obj.v1 = 'v1'; obj.v2 = 'v2'; obj.type = 'folder'; obj._index = _index; obj.v1_name = item1.dir_name; obj.v2_name = item2.dir_name; obj.v1_file_cnt = item1.file_cnt; obj.v2_file_cnt = item2.file_cnt; obj.v1_size = item1.size; obj.v2_size = item2.size; obj.diff_count = item1.file_cnt - item2.file_cnt; obj.diff_size = item1.size - item2.size; obj.name = d1[k1]['dir_name']; obj.parent_name = parent_name; obj.path = parent_name + '&&&' + cur_name; obj[obj.path] = true; obj.cur_name = cur_name; obj.is_open = true; if (_index === 1) { obj._path = item1.dir_name; } else { obj._path = parent_path + '\' + item1.dir_name; } arr.push(obj); if (hasdirs(item1) || hasdirs(item2)) { arr = arr.concat(get_files(item1.dirs, item2.dirs, obj.path, _index, obj._path)) } if (hasfiles(item1) || hasfiles(item2)) { arr = arr.concat(get_file(item1.files, item2.files, obj.path, _index, obj._path)); } } } for (var k2 in d2) { if (!(k2 in d1)) { var cur_name = d2[k2]['dir_name'] + _index + Math.random().toString(32).slice(-6); var item1 = {}; var item2 = d2[k2] || {}; var obj = {}; obj.v1 = 'v1'; obj.v2 = 'v2'; obj.type = 'folder'; obj._index = _index; obj.v1_name = item1.dir_name || ''; obj.v2_name = item2.dir_name; obj.v1_file_cnt = ''; obj.v2_file_cnt = item2.file_cnt; obj.v1_size = ''; obj.v2_size = item2.size; obj.diff_count = -item2.file_cnt; obj.diff_size = -item2.size; obj.name = d2[k2]['dir_name']; obj.parent_name = parent_name; obj.path = parent_name + '&&&' + cur_name; obj[obj.path] = true; obj.cur_name = cur_name; obj.is_open = true; if (_index === 1) { obj._path = d2[k2].dir_name; } else { obj._path = parent_path + '\' + d2[k2].dir_name; } // console.log(item1,item2,'tem') arr.push(obj); if (hasdirs(item1) || hasdirs(item2)) { arr = arr.concat(get_files(item1.dirs, item2.dirs, obj.path, _index, obj._path)); } if (hasfiles(item1) || hasfiles(item2)) { // console.log(item1.files,'item.files'); arr = arr.concat(get_file(item1.files, item2.files, obj.path, _index, obj._path)); } // if(hasfiles(item1) || hasfiles(item2)){ // // console.log(item1.files,'item.files'); // arr = arr.concat(get_file(item1.files,item2.files,obj.path,_index)); // }else if(hasdirs(item1) || hasdirs(item2)){ // arr = arr.concat(get_files(item1.dirs,item2.dirs,obj.path,_index)); // } } } return arr; }
//解析文件夹下的文件
function get_file(file1 = {}, file2 = {}, parent_name = '', _index, parent_path) { _index = _index || 0; _index++; var arr = []; for (var f1 in file1) { var file_item1 = file1[f1] || {}; var file_item2 = file2[f1] || {}; var obj = {}; obj.v1 = 'v1'; obj.v2 = 'v2'; obj.type = 'file'; obj._index = _index; obj.v1_name = file_item1.file_name; obj.v2_name = file_item2.file_name; obj.v1_size = file_item1.size; obj.v2_size = file_item2.size; if (_index === 1) { obj._path = file_item1.file_name; } else { obj._path = parent_path + '\' + file_item1.file_name; } obj.diff_count = ''; obj.diff_size = (file_item1.size || 0) - (file_item2.size || 0); obj.name = file1[f1].file_name; obj.parent_name = parent_name; obj.path = parent_name + f1; obj[obj.path] = true; obj.is_open = true; obj.cur_name = f1; arr.push(obj); } for (var k2 in file2) { if (!(k2 in file1)) { var file_item1 = file1[k2] || {}; var file_item2 = file2[k2] || {}; var obj = {}; obj.v1 = 'v1'; obj.v2 = 'v2'; obj.type = 'file'; obj._index = _index; obj.name = file2[k2].file_name; obj.v1_name = file_item1.file_name; obj.v2_name = file_item2.file_name; obj.v1_size = file_item1.size; obj.v2_size = file_item2.size; if (_index === 1) { obj._path = file_item2.file_name; } else { obj._path = parent_path + '\' + file_item2.file_name; } obj.diff_count = ''; obj.diff_size = -(file_item2.size || 0); obj.parent_name = parent_name; obj.path = parent_name + k2; obj[obj.path] = true; obj.is_open = true; obj.cur_name = k2; arr.push(obj); } } return arr; }
//data即为所需数据
var
data = get_files(arr_to_obj(d1),arr_to_obj(d2));
原文地址:https://www.cnblogs.com/hill-foryou/p/10678669.html