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

2021-05-12 13:28:52 +08:00
 aglsv

很新手,关于这个数组

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

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

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

请问这个该怎么写啊

1712 次点击
所在节点    JavaScript
12 条回复
aglsv
2021-05-12 13:33:54 +08:00
有没有人可以来回答一下 TvT
whitelee8080
2021-05-12 13:46:43 +08:00
遍历放到 map 中。
grewer
2021-05-12 13:56:53 +08:00
aglsv
2021-05-12 14:11:17 +08:00
@whitelee8080 请问有具体的代码吗,我不太能搞懂
hello2060
2021-05-12 14:43:36 +08:00
索引项 1 是啥意思?
umissthestars
2021-05-12 14:50:42 +08:00
说吧,测试数据除了两三条的,会不会突然来个 9 万 9 千条的,多久算超时。

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

如果只有 2 个,里面也都是填充大写字母,用工具大约是
对两个[1]join,然后 填个大于小于的比较 sort,然后看是否要合并,然后 split 回来,大约 4-5 行的样子
aglsv
2021-05-12 15:12:20 +08:00
@hello2060 就是后面那个字母那一项
aglsv
2021-05-12 15:21:44 +08:00
@umissthestars
```
function uni(arr) {
let res = {};
arr.map((item) => {
item.sort((a, b) => a - b);
res[item] = item;
});
return Object.values(res);
}
```
这么写了个去重的,想问问如果这两条数据之间还有其他数据的话,怎么比较这两个数据并合并
umissthestars
2021-05-12 15:23:42 +08:00
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
2021-05-12 15:27:45 +08:00
@aglsv 那就两步啊, 第一步把 1 项去重, 第二步合并. 根据 1 项实际的长度看要不要生成一个 hash 这样合并的时候直接比较 hash
umissthestars
2021-05-12 17:23:27 +08:00
@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
2021-05-12 17:33:50 +08:00
sort, 然后遍历一遍去重。这样处理过之后可以拼接出一个字符串,用这个字符串做 key 插入到 hash table 里去。
之后每一项 sort 并去重后,先去 hash table 里查之前有没有这个 key,有的话就拼接,没有就插入。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/776463

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX