昨天晚上,朋友问我,怎么把四万条数据放到内存中处理?
作为Nodejser,我是不喜欢一次处理这么多数据的,或者说不希望四万条数据都放在内存中。进一步询问,我才知道问题是这样的。
现在有三类数据,都是数组保存,对这三类数据按顺序排列组合,会得到4W种可能,需要把这4W种结果发送网络请求。
那么问题就从怎么把4W条数据保存在内存简化为排列组合问题了。
简化问题
假设现在有三类数据分别为A,B,C,组合形式为AiBjCk
。这个问题就能简化为类似进制问题。
我们把C的数据看为个位,B的数据看为十位,A为百位。当C遍历一次,B下标进一位,当B遍历一次A下标进一位,当A遍历一次,就是全部的排列组合。
Show Time
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| function getList(A, B, C) { let Ai = 0; let Bi = 0; let Ci = 0; let Al = A.length - 1; let Bl = B.length - 1; let Cl = C.length - 1; return (length = 10) => { let list = []; let list_i = 0; while (list_i < length) { if (A[Ai] === undefined) { return list; } list[list_i] = [A[Ai], B[Bi], C[Ci]]; Ci++; list_i++; if (Ci > Cl) { Bi++; Ci = 0; } if (Bi > Bl) { Ai++; Bi = 0; } if (Ai > Al) { break; } } return list; } }
let A = [1, 2, 0, 23]; let B = [3, 4, 10, 77]; let C = [5, 6, 20, 4]; List = getList(A,B,C);
console.log(List(15));
|
这里就用到闭包来解决这个问题。为什么用闭包?因为不想内部变量被修改。这个代码没有对传入参数进行检验和拦截,大家凑活看吧。