zoukankan      html  css  js  c++  java
  • 文件对比 接上文

    接上文链接 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));
  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/hill-foryou/p/10678669.html
Copyright © 2011-2022 走看看