V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
aglsv
V2EX  ›  JavaScript

关于数组上的问题,想请教一下各位彭于晏们

  •  
  •   aglsv · 207 天前 · 1205 次点击
    这是一个创建于 207 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很新手,关于这个数组

    [
      ["工具", [["U"], ["B"], ["U"], ["I"]]],
      ["学习", [["I"], ["B"], ["I"], ["U"]]],
    ]
    

    如果索引项 1 中的数组有相同的先去重,之后如果两个数组相同就合并,就想上面这个输出的结果是

    [
      ["工具学习", [["B"], ["I"], ["U"]]],
    ]
    

    请问这个该怎么写啊

    12 条回复    2021-05-12 17:33:50 +08:00
    aglsv
        1
    aglsv  
    OP
       207 天前
    有没有人可以来回答一下 TvT
    whitelee8080
        2
    whitelee8080  
       207 天前
    遍历放到 map 中。
    grewer
        3
    grewer  
       207 天前
    aglsv
        4
    aglsv  
    OP
       207 天前
    @whitelee8080 请问有具体的代码吗,我不太能搞懂
    hello2060
        5
    hello2060  
       207 天前 via iPhone
    索引项 1 是啥意思?
    umissthestars
        6
    umissthestars  
       207 天前
    说吧,测试数据除了两三条的,会不会突然来个 9 万 9 千条的,多久算超时。

    =============

    如果只有 2 个,里面也都是填充大写字母,用工具大约是
    对两个[1]join,然后 填个大于小于的比较 sort,然后看是否要合并,然后 split 回来,大约 4-5 行的样子
    aglsv
        7
    aglsv  
    OP
       207 天前
    @hello2060 就是后面那个字母那一项
    aglsv
        8
    aglsv  
    OP
       207 天前
    @umissthestars
    ```
    function uni(arr) {
    let res = {};
    arr.map((item) => {
    item.sort((a, b) => a - b);
    res[item] = item;
    });
    return Object.values(res);
    }
    ```
    这么写了个去重的,想问问如果这两条数据之间还有其他数据的话,怎么比较这两个数据并合并
    umissthestars
        9
    umissthestars  
       207 天前   ❤️ 1
    function merge (input) {
    const a1 = sort(unique(input[0][1]))
    const a2 = sort(unique(input[1][1]))
    if (a1.join() === a2.join())
    return { [`${input[0][0]}${input[1][0]}`]: a1.flatMap(i => [i]) }
    else
    return input
    }
    function unique (arr) {
    const ret = arr.flatMap(i => i[0])
    return [...new Set(ret)]
    }
    function sort (arr) {
    return arr.sort((a, b) => a.charCodeAt() - b.charCodeAt())
    }
    hello2060
        10
    hello2060  
       207 天前
    @aglsv 那就两步啊, 第一步把 1 项去重, 第二步合并. 根据 1 项实际的长度看要不要生成一个 hash 这样合并的时候直接比较 hash
    umissthestars
        11
    umissthestars  
       207 天前
    @aglsv 有多条数据就把上面改改

    function merge(input) {
    const record = {};
    input.forEach((item) => {
    const itemValue = sort(unique(item[1]));
    if (record[itemValue]) {
    record[itemValue].push(item[0]);
    } else {
    // 反过来存方便查询
    record[itemValue] = [item[0]];
    }
    });
    return decorate(record);
    }
    function decorate(record) {
    const result = [];
    Object.entries(record).forEach(([v, k]) => {
    result.push([k.join(""), v.split(',').flatMap(i => [i])]);
    });
    return result;
    }
    function unique(arr) {
    return [...new Set(arr.flatMap((i) => i[0]))];
    }
    function sort(arr) {
    return arr.sort((a, b) => a.charCodeAt() - b.charCodeAt());
    }
    jmc891205
        12
    jmc891205  
       207 天前
    sort, 然后遍历一遍去重。这样处理过之后可以拼接出一个字符串,用这个字符串做 key 插入到 hash table 里去。
    之后每一项 sort 并去重后,先去 hash table 里查之前有没有这个 key,有的话就拼接,没有就插入。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2412 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:20 · PVG 22:20 · LAX 06:20 · JFK 09:20
    ♥ Do have faith in what you're doing.