UNPKG

zent

Version:

一套前端设计语言和基于React的实现

146 lines (121 loc) 4.28 kB
'use strict'; 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(','); }); }