@react-vant-next/campaign
Version:
React Mobile UI Components based on Vant UI - Next Generation
147 lines (142 loc) • 5.12 kB
JavaScript
;
var constants = require('./constants.js');
function getSkuImgValue(sku, selectedSku) {
let imgValue;
sku.tree.some((item) => {
const id = selectedSku[item.k_s];
if (id && item.v) {
const matchedSkuIdx = item.v.findIndex(skuValue => skuValue.id === id);
const matchedSku = item.v[matchedSkuIdx];
const img = (matchedSku === null || matchedSku === void 0 ? void 0 : matchedSku.previewImgUrl) || (matchedSku === null || matchedSku === void 0 ? void 0 : matchedSku.imgUrl) || (matchedSku === null || matchedSku === void 0 ? void 0 : matchedSku.img_url);
if (img) {
imgValue = Object.assign(Object.assign({}, matchedSku), { ks: item.k_s, imgUrl: img, position: matchedSkuIdx });
return true;
}
}
return false;
});
return imgValue;
}
/*
normalize sku tree
[
{
count: 2,
k: "品种", // 规格名称 skuKeyName
k_id: "1200", // skuKeyId
k_s: "s1" // skuKeyStr
v: [ // skuValues
{ // skuValue
id: "1201", // skuValueId
name: "萌" // 具体的规格值 skuValueName
}, {
id: "973",
name: "帅"
}
]
},
...
]
|
v
{
s1: [{
id: "1201",
name: "萌"
}, {
id: "973",
name: "帅"
}],
...
}
*/
function normalizeSkuTree(skuTree) {
const normalizedTree = {};
skuTree.forEach((treeItem) => {
normalizedTree[treeItem.k_s] = treeItem.v;
});
return normalizedTree;
}
function normalizePropList(propList) {
const normalizedProp = {};
propList.forEach((item) => {
const itemObj = {};
item.v.forEach((it) => {
itemObj[it.id] = it;
});
normalizedProp[item.k_id] = itemObj;
});
return normalizedProp;
}
// 判断是否所有的sku都已经选中
function isAllSelected(skuTree, selectedSku) {
// 筛选selectedSku对象中key值不为空的值
const selected = Object.keys(selectedSku).filter(skuKeyStr => selectedSku[skuKeyStr] !== constants.UNSELECTED_SKU_VALUE_ID);
return skuTree.length === selected.length;
}
// 根据已选择的 sku 获取 skuComb
function getSkuComb(skuList, selectedSku) {
const skuComb = skuList.filter(item => Object.keys(selectedSku).every(skuKeyStr => String(item[skuKeyStr]) === String(selectedSku[skuKeyStr])));
return skuComb[0];
}
// 获取已选择的sku名称
function getSelectedSkuValues(skuTree, selectedSku) {
const normalizedTree = normalizeSkuTree(skuTree);
return Object.keys(selectedSku).reduce((selectedValues, skuKeyStr) => {
const skuValues = normalizedTree[skuKeyStr];
const skuValueId = selectedSku[skuKeyStr];
if (skuValueId !== constants.UNSELECTED_SKU_VALUE_ID) {
const skuValue = skuValues.filter(value => value.id === skuValueId)[0];
skuValue && selectedValues.push(skuValue);
}
return selectedValues;
}, []);
}
// 判断sku是否可选
function isSkuChoosable(skuList, selectedSku, skuToChoose) {
const { key, valueId } = skuToChoose;
// 先假设sku已选中,拼入已选中sku对象中
const matchedSku = Object.assign(Object.assign({}, selectedSku), { [key]: valueId });
// 再判断剩余sku是否全部不可选,若不可选则当前sku不可选中
const skusToCheck = Object.keys(matchedSku).filter(skuKey => matchedSku[skuKey] !== constants.UNSELECTED_SKU_VALUE_ID);
const filteredSku = skuList.filter(sku => skusToCheck.every(skuKey => String(matchedSku[skuKey]) === String(sku[skuKey])));
const stock = filteredSku.reduce((total, sku) => {
total += sku.stock_num;
return total;
}, 0);
return stock > 0;
}
function getSelectedPropValues(propList, selectedProp) {
const normalizeProp = normalizePropList(propList);
return Object.keys(selectedProp).reduce((acc, cur) => {
selectedProp[cur].forEach((it) => {
acc.push(Object.assign({}, normalizeProp[cur][it]));
});
return acc;
}, []);
}
function getSelectedProperties(propList, selectedProp) {
const list = [];
(propList || []).forEach((prop) => {
if (selectedProp[prop.k_id] && selectedProp[prop.k_id].length > 0) {
const v = [];
prop.v.forEach((it) => {
if (selectedProp[prop.k_id].includes(it.id)) {
v.push(Object.assign({}, it));
}
});
list.push(Object.assign(Object.assign({}, prop), { v }));
}
});
return list;
}
exports.getSelectedPropValues = getSelectedPropValues;
exports.getSelectedProperties = getSelectedProperties;
exports.getSelectedSkuValues = getSelectedSkuValues;
exports.getSkuComb = getSkuComb;
exports.getSkuImgValue = getSkuImgValue;
exports.isAllSelected = isAllSelected;
exports.isSkuChoosable = isSkuChoosable;
exports.normalizePropList = normalizePropList;
exports.normalizeSkuTree = normalizeSkuTree;
//# sourceMappingURL=utils.js.map