<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>

标签: none

添加新评论