zent
Version:
一套前端设计语言和基于React的实现
146 lines (121 loc) • 4.28 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
exports.isPromiseLike = isPromiseLike;
exports.isArray = isArray;
exports.getLevels = getLevels;
exports.flatten = flatten;
exports.isEqual = isEqual;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function isPromiseLike(p) {
if (!p) {
return false;
}
var proto = Object.getPrototypeOf ? Object.getPrototypeOf(p) : p.__proto__; // eslint-disable-line
return typeof proto.then === 'function';
}
function isArray(arr) {
return Object.prototype.toString.apply(arr) === '[object Array]';
}
// 计算每个sku后面有多少项
function getLevels(tree) {
var level = [];
for (var i = tree.length - 1; i >= 0; i--) {
if (tree[i + 1] && tree[i + 1].leaf) {
level[i] = tree[i + 1].leaf.length * level[i + 1] || 1;
} else {
level[i] = 1;
}
}
return level;
}
/**
* 笛卡尔积运算
* @param {[type]} tree [description]
* @param {Array} stocks [description]
* @return {[type]} [description]
*/
function flatten(tree) {
var stocks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
var options = arguments[2];
var _ref = options || {},
_ref$optionValue = _ref.optionValue,
optionValue = _ref$optionValue === undefined ? 'id' : _ref$optionValue,
_ref$optionText = _ref.optionText,
optionText = _ref$optionText === undefined ? 'text' : _ref$optionText;
var result = [];
var skuLen = 0;
var stockMap = {}; // 记录已存在的stock的数据
var level = getLevels(tree);
if (tree.length === 0) return result;
tree.forEach(function (sku) {
var leaf = sku.leaf;
if (!leaf || leaf.length === 0) return true;
skuLen = (skuLen || 1) * leaf.length;
});
// 根据已有的stocks生成一个map
stocks.forEach(function (stock) {
var skus = stock.skus,
attr = (0, _objectWithoutProperties3['default'])(stock, ['skus']);
stockMap[skus.map(function (item) {
return item.k_id + '_' + item.v_id;
}).join('|')] = attr;
});
var _loop = function _loop(i) {
var skus = [];
var mapKey = [];
tree.forEach(function (sku, column) {
var leaf = sku.leaf;
var item = {};
if (!leaf || leaf.length === 0) return true;
if (leaf.length > 1) {
var row = parseInt(i / level[column], 10) % leaf.length;
item = tree[column].leaf[row];
} else {
item = tree[column].leaf[0];
}
if (!sku[optionValue] || !item[optionValue]) return;
mapKey.push(sku[optionValue] + '_' + item[optionValue]);
skus.push({
k_id: sku[optionValue],
k: sku[optionText],
v_id: item[optionValue],
v: item[optionText]
});
});
var _ref2 = stockMap[mapKey.join('|')] || {},
data = (0, _objectWithoutProperties3['default'])(_ref2, []);
// 从map中找出存在的sku并保留其值
result.push((0, _extends3['default'])({}, data, { skus: skus }));
};
for (var i = 0; i < skuLen; i++) {
_loop(i);
}
return result;
}
/**
* 判断两个sku是否相同
* @param {[type]} prevSKU [description]
* @param {[type]} nextSKU [description]
* @return {Boolean} [description]
*/
function isEqual(prevSKU, nextSKU, options) {
var _ref3 = options || {},
_ref3$optionValue = _ref3.optionValue,
optionValue = _ref3$optionValue === undefined ? 'id' : _ref3$optionValue;
return nextSKU.length === prevSKU.length && nextSKU.every(function (_ref4, index) {
var _ref4$leaf = _ref4.leaf,
leaf = _ref4$leaf === undefined ? [] : _ref4$leaf;
var prevLeaf = prevSKU[index].leaf || [];
return prevSKU[index][optionValue] === nextSKU[index][optionValue] && leaf.length === prevLeaf.length && leaf.map(function (item) {
return item[optionValue];
}).join(',') === prevLeaf.map(function (item) {
return item[optionValue];
}).join(',');
});
}