# 演示

属性:
属性:
属性:
price:--
stock:--

# 后台返回数据结构

var data = {
	"12;24;31": {price: 366.00, count: 46}, 
	"12;25;32": {price: 406, count: 66},
	"13;24;32": {price: 506, count: 6}
};

# 初始化得到结果集


function initSKU() {
  var i, j, skuKeys = getObjKeys(data);
  console.log(skuKeys)
  for(i = 0; i < skuKeys.length; i++) {
      var skuKey = skuKeys[i];//一条SKU信息key
      var sku = data[skuKey]; //一条SKU信息value
      var skuKeyAttrs = skuKey.split(";"); //SKU信息key属性值数组
      skuKeyAttrs.sort(function(value1, value2) {
        return parseInt(value1) - parseInt(value2);
      });

  //对每个SKU信息key属性值进行拆分组合
  var combArr = combInArray(skuKeyAttrs);
  for(j = 0; j < combArr.length; j++) {
    add2SKUResult(combArr[j], sku);
  }

  //结果集接放入SKUResult
  SKUResult[skuKeyAttrs.join(";")] = {
      count:sku.count,
      prices:[sku.price]
  }
  console.log('集合',SKUResult)
  }
};

# 一些变形的函数

//获得对象的key
function getObjKeys(obj) {
  if (obj !== Object(obj)) throw new TypeError('Invalid object');
  var keys = [];
  for (var key in obj)
    if (Object.prototype.hasOwnProperty.call(obj, key))
    keys[keys.length] = key;
  return keys;
}

//把组合的key放入结果集SKUResult
function add2SKUResult(combArrItem, sku) {
  var key = combArrItem.join(";");
  if(SKUResult[key]) {//SKU信息key属性·
      SKUResult[key].count += sku.count;
      SKUResult[key].prices.push(sku.price);
  } else {
      SKUResult[key] = {
          count : sku.count,
          prices : [sku.price],
      };
  }
}

/**
* 从数组中生成指定长度的组合
* 方法: 先生成[0,1...]形式的数组, 然后根据0,1从原数组取元素,得到组合数组
*/
function combInArray(aData) {
  if(!aData || !aData.length) {
    return [];
  }

var len = aData.length;
var aResult = [];

for(var n = 1; n < len; n++) {
  var aaFlags = getCombFlags(len, n);
  while(aaFlags.length) {
    var aFlag = aaFlags.shift();
    var aComb = [];
    for(var i = 0; i < len; i++) {
      aFlag[i] && aComb.push(aData[i]);
    }
    aResult.push(aComb);

  }
}
return aResult;
}

 /**
 * 得到从 m 元素中取 n 元素的所有组合
 * 结果为[0,1...]形式的数组, 1表示选中,0表示不选
 */
function getCombFlags(m, n) {
  if(!n || n < 1) {
    return [];
  }
  var aResult = [];
  var aFlag = [];
  var bNext = true;
  var i, j, iCnt1;

  for (i = 0; i < m; i++) {
    aFlag[i] = i < n ? 1 : 0;
  }

  aResult.push(aFlag.concat());

  while (bNext) {
    iCnt1 = 0;
    for (i = 0; i < m - 1; i++) {
      if (aFlag[i] == 1 && aFlag[i+1] == 0) {
        for(j = 0; j < i; j++) {
          aFlag[j] = j < iCnt1 ? 1 : 0;
        }
        aFlag[i] = 0;
        aFlag[i+1] = 1;
        var aTmp = aFlag.concat();
        aResult.push(aTmp);
        if(aTmp.slice(-n).join("").indexOf('0') == -1) {
          bNext = false;
        }
        break;
      }
      aFlag[i] == 1 && iCnt1++;
    }
  }
  return aResult;
} 

# 结果集


SKUResult = {
	12: {count: 112, prices: Array(2)}
	12;24: {count: 46, prices: Array(1)}
	12;24;31: {count: 46, prices: Array(1)}
	12;25: {count: 66, prices: Array(1)}
	12;25;32: {count: 66, prices: Array(1)}
	12;31: {count: 46, prices: Array(1)}
	12;32: {count: 66, prices: Array(1)}
	13: {count: 6, prices: Array(1)}
	13;24: {count: 6, prices: Array(1)}
	13;24;32: {count: 6, prices: Array(1)}
	13;32: {count: 6, prices: Array(1)}
	24: {count: 52, prices: Array(2)}
	24;31: {count: 46, prices: Array(1)}
	24;32: {count: 6, prices: Array(1)}
	25: {count: 66, prices: Array(1)}
	25;32: {count: 66, prices: Array(1)}
	31: {count: 46, prices: Array(1)}
	32: {count: 72, prices: Array(2)}
}

# 选择

$('.sku').each(function() {
  var self = $(this);
  var attr_id = self.attr('attr_id');
  if(!SKUResult[attr_id]) {
    self.attr('disabled', 'disabled');
  }
}).click(function() {
  var self = $(this);

  //选中自己,兄弟节点取消选中
  self.toggleClass('bh-sku-selected').siblings().removeClass('bh-sku-selected');

	//已经选择的节点
	var selectedObjs = $('.bh-sku-selected');

	if(selectedObjs.length) {
	  //获得组合key价格
	  var selectedIds = [];
	  selectedObjs.each(function() {
	    selectedIds.push($(this).attr('attr_id'));
	  });
	  selectedIds.sort(function(value1, value2) {
	    return parseInt(value1) - parseInt(value2);
	  });
	  console.log(selectedIds)
	  var len = selectedIds.length;
	  var prices = SKUResult[selectedIds.join(';')].prices;
	  var maxPrice = Math.max.apply(Math, prices);
	  var minPrice = Math.min.apply(Math, prices);
	  var stock = SKUResult[selectedIds.join(';')].count;
	  $('#price').text(maxPrice > minPrice ? minPrice + "-" + maxPrice : maxPrice);
	  $('#stock').text(stock);
	  //用已选中的节点验证待测试节点 underTestObjs
	  $(".sku").not(selectedObjs).not(self).each(function() {
	    var siblingsSelectedObj = $(this).siblings('.bh-sku-selected');
	    var testAttrIds = [];//从选中节点中去掉选中的兄弟节点
	    if(siblingsSelectedObj.length) {
	      var siblingsSelectedObjId = siblingsSelectedObj.attr('attr_id');
	      for(var i = 0; i < len; i++) {
	        (selectedIds[i] != siblingsSelectedObjId) && testAttrIds.push(selectedIds[i]);
	      }
	    } else {
	      testAttrIds = selectedIds.concat();
	    }
	    testAttrIds = testAttrIds.concat($(this).attr('attr_id'));
	    testAttrIds.sort(function(value1, value2) {
	      return parseInt(value1) - parseInt(value2);
	    });
	    if(!SKUResult[testAttrIds.join(';')]) {
	      $(this).attr('disabled', 'disabled').removeClass('bh-sku-selected');
	    } else {
	      $(this).removeAttr('disabled');
	    }
	  });
	} else {
	  //设置默认价格
	  $('#price').text('--');
	  //设置属性状态
	  $('.sku').each(function() {
	    SKUResult[$(this).attr('attr_id')] ? $(this).removeAttr('disabled') : $(this).attr('disabled', 'disabled').removeClass('bh-sku-selected');
	  })
	}
});