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));
  • 相关阅读:
    开源播放器 ijkplayer (五) :Linux/Ubuntu 下编译ijkplayer
    Android JNI 学习(三):JNI 数据类型和数据结构
    Android JNI 学习(二):JNI 设计机制
    Android JNI 学习(一):JNI 简介
    Netty学习4—NIO服务端报错:远程主机强迫关闭了一个现有的连接
    elasticsearch中的java.io.IOException: 远程主机强迫关闭了一个现有的连接
    Eleaticsearch源码分析(一)编译启动
    elasticsearch6.3.1 安装以及配置IK 使用
    elasticsearch索引自动清理
    Java多线程之控制执行顺序
  • 原文地址:https://www.cnblogs.com/hill-foryou/p/10678669.html
Copyright © 2011-2022 走看看