JavaScript技术问询:如何根据EAN码获取variantCodesObject数组中对应对象的键值
解决EAN码匹配对应键值的问题
我来帮你搞定这个问题~你的核心需求是根据cart数组里的EAN码,找到variantCodesObject数组中对应对象的键值(比如EAN7350038272416对应键261584049),咱们一步步拆解解决:
先说说你之前代码的问题
你之前用indexOf去查找EAN是行不通的,因为variantCodesObject是对象数组,不是字符串数组,indexOf只能匹配简单类型的元素;另外你尝试的forEach循环里,用item.indexOf(ean)也是错误的——item是单个对象,对象没有indexOf方法,所以这个判断逻辑根本不生效。
方案1:直接遍历匹配(适合小数据量)
可以用数组的find方法,找到匹配EAN的对象,再提取它的键:
cart.forEach(function(cartItem) { const ean = cartItem.ean; const qty = cartItem.quantity; // 找到variantCodesObject中值等于当前EAN的对象 const matchedVariant = variantCodesObject.find(item => { // 取出对象的唯一值,和EAN对比 return Object.values(item)[0] === ean; }); if (matchedVariant) { // 获取该对象的唯一键 const variantKey = Object.keys(matchedVariant)[0]; // 现在可以把variantKey传给你的请求函数了 makeSomeRequest(variantKey, qty); } });
这段代码里,Object.values(item)[0]是因为你的每个variant对象都只有一个键值对,所以取第一个值就行;同理Object.keys(matchedVariant)[0]取第一个键。
方案2:构建映射表(适合大数据量,效率更高)
如果你的cart或者variantCodesObject数据量比较大,每次遍历查找会很耗时,建议先把EAN和对应键的关系存成一个映射表,之后直接查表即可:
// 第一步:先构建EAN到键的映射对象 const eanToVariantMap = {}; variantCodesObject.forEach(item => { const key = Object.keys(item)[0]; const eanValue = item[key]; eanToVariantMap[eanValue] = key; }); // 第二步:遍历cart直接查表 cart.forEach(function(cartItem) { const ean = cartItem.ean; const qty = cartItem.quantity; // 直接从映射表拿对应的键 const variantKey = eanToVariantMap[ean]; if (variantKey) { makeSomeRequest(variantKey, qty); } });
这种方式只需要遍历一次variantCodesObject,之后每次查找都是O(1)的时间复杂度,比方案1的O(n)高效很多。
验证你的示例
对于EAN7350038272416,两种方案都会找到对应的键261584049,完美符合你的需求~
内容的提问来源于stack exchange,提问作者Meules
相关产品推荐
相关产品推荐

