• 二维数组中按子数组首个元素值去重


    后台更新了算法,用来挖掘数据,前台(我)配合后台搭建了新页面,历时两周,从 0 到 现在的联调完毕,呼呼,有累,但更多的是完成工作后的喜悦。

    废话不多说,联调过程中遇到一个接口需要传输二维数组,是关于选择句子,然后将文档号和句子号拼接成数组,再压入大数组来向后台发送要保存的数据的。

    而前台在存储时,选择的句子会直接存储其所属文档号,这样底层存储的数组就会变成对象数组:

    arr = [
        {name:***,docNum:0,lineNum:3},
        {name:***,docNum:2,lineNum:1},
        {name:***,docNum:3,lineNum:2},
        {name:***,docNum:0,lineNum:1},
        {name:***,docNum:3,lineNum:2},
        {name:***,docNum:2,lineNum:3},
    ]

    接口要求形式则为:

    arr = [
        [0,2,3],
        [1,1,2,3]
    ]

    子数组首个元素代表文档号,之后是句子号。

    在这坑了用循环占了好久。。。

    最后想到了对象的属性的特点才发现原来如此的简单:

    //经过循环将对象数组变成这样
    $scope.list = [
        [1,2],
        [0,2],
        [1,3],
        [0,1],
        [1,4],
    ]
    //接着是去重,使用对象属性的特点,将文档号存成属性名,行号保存为其值
    var docNumObj = {}
    angular.forEach($scope.list, function (obj ,i) {
        if(!docNumObj[obj[0]]) {
            docNumObj[obj[0]] = obj[1].toString();
        } else {
            docNumObj[obj[0]] += obj[1].toString();
        }
    })
    console.log(docNumObj);
    //再接着遍历对象属性,拼数组
    var finalArr = [];
    for(var i in docNumObj) {
        console.log(i);
        var charsArr = docNumObj[i].split('');
        charsArr.unshift(i);
        finalArr.push(charsArr);
    }
    console.log(finalArr);

    这样还是很简单哒!

  • 相关阅读:
    VScode快捷键:单行注释和多行注释
    常见状态码的含义
    2019年10月22日 文件操作复习
    2019年10月7日 函数复习
    2019年10月4日 元类
    2019年10月2日 property补充
    2019年10月1日 实现延迟计算功能
    2019年9月30日 property流程分析
    2019年9月29日 自定制property
    2019年9月23日 类的装饰器的应用
  • 原文地址:https://www.cnblogs.com/guofan/p/6964164.html
Copyright © 2020-2023  润新知