<script>
/**
* 数组中此元素出现的次数
* @param search
* @param array
* @returns {number}
*/
function in_array_count(search, array) {
var num = 0;
for (var i in array) {
if (array[i] == search) {
num++;
}
}
return num;
}
/**
* 数组中此元素是否出现
* @param search
* @param array
* @returns {boolean}
*/
function in_array(search, array) {
for (var i in array) {
if (array[i] == search) {
return true;
}
}
return false;
}
/**
* 获取全部组合
* @returns {Array}
*/
function getProperty() {
var property_name = ['颜色','颜色','尺寸','尺寸','尺寸','内存','内存','厚度','厚度']; //属性名数组
var property_value= ['红色','黑色','3.5','5.5','6.5','64G','128G','10mm','20mm'];
var property_name_unique = []; //去重的属性名
var property_value_unique = []; //每个属性名对应的值 二维数组
var property_name_val_count = [];//每个属性名对应的值个数
var var_total_group = 1; //组合的数量
//所有的属性值
for(value_key in property_value){
if (!in_array(property_name[value_key], property_name_unique)) {
property_name_unique.push(property_name[value_key]);//去重后的属性名
property_value_unique[property_name[value_key]] = [];
property_name_val_count[property_name[value_key]] = 0;
}
property_value_unique[property_name[value_key]].push(property_value[value_key]);//去重的属性名对应的属性值
property_name_val_count[property_name[value_key]]++;//去重后的属性名有几个值
};
//总组合数 为各个属性 拥有值个数的 累乘
for (var num_p in property_name_val_count) {
var_total_group = property_name_val_count[num_p] * var_total_group;
}
var ceng = 0; //当前第几层
var pipei = []; //匹配的结果值
var ceng_old = 'X'; //上次循环时的层数
var this_ceng_l_j = 1; //当前层属性值个数 与 过往层个数累乘 var_total_group➗this_ceng_l_j=本层每种结果可出现重复的次数
//根据不同属性个数 property_name_unique.length 分为 property_name_unique.length 层
for (var time = 0; time < var_total_group * property_name_unique.length; time++) {
ceng = Math.floor(time / var_total_group);
if (ceng == 0) {
//第一层初始化字符串
pipei[time % var_total_group] = '';
}
//这一层拥有属性值得个数
this_ceng_l = property_value_unique[property_name_unique[ceng]].length;
//当前层 属性值个数 与 过往层个数 累乘
if (ceng_old != ceng) {
this_ceng_l_j = this_ceng_l * this_ceng_l_j;
}
for (var ceng_t_n = 0; ceng_t_n < this_ceng_l; ceng_t_n++) {
temp_str = pipei[time % var_total_group] + property_name_unique[ceng] + '--' + property_value_unique[property_name_unique[ceng]][ceng_t_n] + '||';
//这种结果可出现重复的次数是否达到最大值
if (in_array_count(temp_str, pipei) < var_total_group / this_ceng_l_j) {
pipei[time % var_total_group] = temp_str;
break;
}
}
ceng_old = ceng;
}
return pipei;
}
</script>