这道 JS 题目最快的办法是什么?

2018-06-09 10:58:59 +08:00
 hoythan
use case1:
Input:['aa','bb','cc'],['dd','ee']
Output:["aadd", "aaee", "bbdd", "bbee", "ccdd", "ccee"]

use case2:
Input:['aa','bb','cc'],['dd','ee'],['ff','gg','hh']
Output:["aaddff", "aaddgg", "aaddhh", "aaeeff", "aaeegg", "aaeehh", "bbddff", "bbddgg", "bbddhh", "bbeeff", "bbeegg", "bbeehh", "ccddff", "ccddgg", "ccddhh", "cceeff", "cceegg", "cceehh"]

输入参数不定

方式 1 大概 250 - 300ms:

var mergeArr = (...args) => {
	
	const mergeString = (a,b) => {
		var s = '';

		for (var i = 0 , len = b.length; i < len; i++){
			if(i !== 0) s += ',';
			s += a.join(b[i] + ',') + b[i];
		}
		
		var arr = s.split(',');
		return arr;
	}

	var arrs = Array.apply(null, args);

	var arrData = arrs[0];
	for (var i = 1,len = arrs.length ; i < len; i++)
		arrData = mergeString(arrData,arrs[i]);

	// console.log(arrData);
};

方式 2 180 - 250 ms

function all() {
    var pro = ''
    for (var i = 0; i < arguments.length; i++) {
        var obj = JSON.stringify(arguments[i]);
        if(i !== arguments.length-1){
            pro = pro + `
                var outArr = []
                function p${i}(str) {
                    for (var i = 0; i < ${obj}.length; i++) {
                        var obj = str + ${obj}[i];
                        p${i+1}(obj)
                    }
                };`
        }else{
            pro = pro + `
                function p${i}(str) {
                    for (var i = 0; i < ${obj}.length; i++) {
                        var obj = str + ${obj}[i];
                        outArr.push(obj)
                    }
                };
                p0('')
                console.log(outArr)
                `
            eval(pro)

        }
    }
}

测试数据:

var time = new Date().getTime();
// mergeArr(['aa','bb','cc'],['dd'],['ee','ff']);
mergeArr(['aa','bb','cc'],['dd','ee'],['ff','gg','hh'],['dd','ee'],['ff','gg','hh'],['dd','ee'],['ff','gg','hh'],['dd','ee'],['ff','gg','hh'],['dd','ee'],['ff','gg','hh'],['ff','gg','hh'],['dd','ee'],['ff','gg','hh']);
console.log(new Date().getTime() - time);

还有更好的办法吗?

4684 次点击
所在节点    JavaScript
30 条回复
hoythan
2018-06-09 14:23:55 +08:00
@xiangyuecn chrome 调试工具自带数据结果缓存的。
hoythan
2018-06-09 14:24:49 +08:00
@xiangyuecn 我这边跑起来 150 - 200 左右
xiangyuecn
2018-06-09 14:29:56 +08:00
@hoythan 原来如此,怪不得以前测试速度经常飘来飘去,我去耍耍研究一下
glacer
2018-06-09 15:24:42 +08:00
笛卡尔积,MySQL 的 Nested Loop Join 了解一下
whileFalse
2018-06-09 15:35:49 +08:00
baelish
2018-06-09 15:37:03 +08:00
```javascript
function mergeArr(...args) {
return args.reduceRight((sum, items, i)=>{
let tt = [];
items.forEach(a=>{
sum.forEach(b=>{
tt.push(a+""+b);
})
})
return tt;
}, [""]);
}
```
RqPS6rhmP3Nyn3Tm
2018-06-09 15:41:17 +08:00
用 C 的指针写,然后上 WebAssembly
Exin
2018-06-09 15:44:18 +08:00
我来一个简短好读一点的:

```js
function mergeArr(...groups) {
const results = []
~(function merge(prefix, nextGroup, ...groups) {
if (nextGroup) nextGroup.forEach(word => merge(prefix + word, ...groups))
else results.push(prefix)
})('', ...groups)
return results
}
```

性能比楼主 append 的那一版略低一点点,但如果把 forEach 换成 for 就几乎一样了
yichinzhu
2018-06-09 15:59:54 +08:00
hoythan
2018-06-09 16:45:18 +08:00
@yichinzhu 100 - 150 左右我这里

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

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

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

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

© 2021 V2EX