解决方案 »
- svg 的 rect标签 fill属性 填充图片
- 为什么我这个JS在IE正常,火狐一片空白的,紧急求助!
- 求救高手!
- 下面这段Javascript为什么不能在FireFox中正常执行
- 请问,如何让这个javascript日历在firefox中正常显示?
- 两个JS语法:整除,强制转换。请教.
- 怎样用程序控制对IE中Internet选项中各种设置的修改?(谢谢,非常急用)
- 如何实现如csdn一样双击时自动滚屏,再击时停止?
- 请问可以用insertAdjacentHTML在一个页面里插入一个JS特效吗?
- 一个超级日期难题?
- ExtJS 如何跟据后台数据加载控件——在线等
- 学习jQuery源码之疑问1,2,3.......
<script>
var arr1=['a1','a1','a2'];
var arr2=['b1','b1','b2'];
alert(get(arr1,arr2));//[[a1,b1],[a1,b2],[a2,b1],[a2,b2]]
function get(arr1,arr2)
{
var arr=[];
if(arr1.length<arr2.length)
{
var o=arr1;
arr1=arr2;
arr2=o;
}
arr1=checkArr(arr1);
arr2=checkArr(arr2);
for(var i=0;i<arr1.length;i++)
{
for(var j=0;j<arr2.length;j++)
{
var temp=[];
temp.push(arr1[i],arr2[j]);
arr.push(temp);
}
}
return arr;
}
function checkArr(arr)//数组去重
{
var json={};
var temp=[];
for(var i=0;i<arr.length;i++)
{
if(!json[arr[i]])
{
temp.push(arr[i]);
json[arr[i]]=1;
}
}
return temp;
}
</script>
var r = [];
var i =0;
var a_len = a.length;for(; i<a_len; i++) {
len = r.length;
for(v in a[i]) r.push([a[i][v]]);
for(j=0; j<len; j++) {
for(v in a[i])
r.push(r[j].concat(a[i][v]));
}
}var f = [];
i=0;
for(;i<r.length;i++){
if(r[i].length == a_len){
f.push(r[i]);
}
}
var $a = f;
a1 b1 c1
a2 b1 c1 现在结果是
a1 b1 c1
a1 b1 c2
a1 b1 c3这样它就变成了最右边的列组合最优先出现了,而不是最左边.
var N = 4;
var cnt = [4, 2, 5, 3];
var temp = [0, 0, 0, 0];
var label = ['a', 'b', 'c', 'd'];
for (var size = N; size >= 1; --size)
for (var mask = (1 << size) - 1; mask < 1 << N;)
{
var total = 1;
for (var i = 0; i < N; ++i)
if (mask & 1 << i)
{
temp[i] = total;
total *= cnt[i];
}
for (var id = 0; id < total; ++id)
{
var s = "";
for (var j = 0; j < N; ++j)
if (mask & 1 << j)
{
var v = (id - id % temp[j]) / temp[j] % cnt[j];
s = s + label[j];
s = s + (v + 1) + " ";
}
s = s + "<br/>";
document.write(s);
}
var x = mask & - mask;
var y = mask + x;
mask = ((mask & ~y) / x >> 1) | y;
}
</script>
测试了一下,结果是正确的,我正在把输入的数据结构改成var data =
[
["A1",'A2']
,["B1","B2"]
,["C1","C2"]
];看来你也会js,
我的输入数据如a1是一个数据来的,没有拆开a与1这样的存放,只是在看似行,列结构而已,担心一会我没搞明白,需要再请教你,一会再二个帖子结分给你.呵呵.
var N = data.length;//列个数
var store = [];
var temp = [];
for (var size = N; size >= 1; --size)
for (var mask = (1 << size) - 1; mask < 1 << N;)
{
var total = 1;
for (var i = 0; i < N; ++i)
if (mask & 1 << i)
{
temp[i] = total;
total *= data[i].length;
}
for (var id = 0; id < total; ++id)
{
var s = [];
for (var j = 0; j < N; ++j)
if (mask & 1 << j)
{
var v = (id - id % temp[j]) / temp[j] % data[j].length;
s.push(data[j][v]);
}
store.push(s);
}
var x = mask & - mask;
var y = mask + x;
mask = ((mask & ~y) / x >> 1) | y;
} return store;
}
var data =
[
["A1",'A2','A3']
,["B1","B2"]
,["C1","C2"]
,['d1']
,['e1','e2','e3']
];document.write(com(data).join('<br />'));</script>
给定集合,枚举元素个数为size的集合,主要是位操作上的技巧。算法2:
在指定列的情况下,每个列选的元素的个数也知道,于是所有组合的个数是cnt[col[0]] * cnt[col[1]] ...
其中col[i]是选择的第i列。
换个角度思考,如果每个列的元素是10,那么每个组合和一个十进制数对应。
每个列元素个数不一定是10,只是变了进制而已,每一位上的进制不同,于是用temp来表示对应位上的权。
然后从小枚举所有的数,可以反向求出来每一位上的权,进而求出对应的元素。