替换数组上的字符串。为什么一件事有效而其他类似的代码不起作用



我有两组代码,一组工作,另一组不。我怎么也想不出为什么。

const arr1 = [
{ sku: '003CON', price: undefined },
{ sku: 1000, price: 2215.49 },
{ sku: 1001, price: 2215.49 },
{ sku: 'PD-1000B', price: undefined },
{ sku: 'PD-1007A', price: 2195.14 },
{ sku: 'PD-1042A', price: 2495.29 },
{ sku: 'BD111-50', price: 2495.29 },
{ sku: 'BD222-50', price: 2495.29 },
{ sku: 'BD333', price: 2495.29 },
{ sku: 'KL.213', price: 2495.29 },
{ sku: 'KL.312', price: undefined },
{ sku: 1005, price: 2495.29 },
{ sku: 5343, price: undefined },
{ sku: 1231, price: undefined },
{ sku: 3542, price: 2495.29 },
{ sku: 6756, price: 2495.29 },
{ sku: 7685, price: undefined },
{ sku: 1076, price: 2495.29 },
] 
var what = arr1.map((e) => {
if (typeof e.sku === 'string') {
return {
sku: e.sku.startsWith("PD-") ? e.sku.replace("S/A", "").trim() :
e.sku.startsWith('KL') ? e.sku.replace('.', '').trim() :
e.sku.startsWith('BD') ? e.sku.replace('-50', '').trim() :
e.sku,
price: typeof e.price === "undefined" ? "0" : e.price,
};
}
else {
return {
sku: e.sku,
price: typeof e.price === 'undefined' ? '0' : e.price
}
}
});
what.forEach(e => {
if (typeof e.sku === 'string') {
if (e.sku.includes('PD-1000B')) {
e.sku = 'PD-1000-B'
}
if (e.sku.includes('PD-1007A')) {
e.sku = 'PD-1007-A'
}
if (e.sku.includes('PD-1042A')) {
e.sku = 'PD-1042-A'
}
}
})
console.log(what)
var what2 = arr1.map((e) => {
if (typeof e.sku === 'string') {
return {
sku: e.sku.startsWith("PD-") ? e.sku.replace("S/A", "").trim() :
e.sku.startsWith('KL') ? e.sku.replace('.', '').trim() :
e.sku.startsWith('BD') ? e.sku.replace('-50', '').trim() :
e.sku.startsWith('PD-1000') ? e.sku.replace('PD-1000','PD-1000-') : //this doesnt work
e.sku.startsWith('PD-1007') ? e.sku.replace('PD-1007','PD-1007-') : //this
e.sku.startsWith('PD-1042') ? e.sku.replace('PD-1042','PD-1042-') : //this
e.sku,
price: typeof e.price === "undefined" ? "0" : e.price,
};
}
else {
return {
sku: e.sku,
price: typeof e.price === 'undefined' ? '0' : e.price
}
}
});
console.log(what2)

所以我不得不""forEach或'PD-1000B'等不会被替换????

我能想到的唯一一件事是,也许如果我已经用'PD-'循环遍历starts,我就不能做类似的事情了?

你的问题是在你的大量三元语句中:

sku: e.sku.startsWith("PD-") ? e.sku.replace("S/A", "").trim() :
e.sku.startsWith('KL') ? e.sku.replace('.', '').trim() :
e.sku.startsWith('BD') ? e.sku.replace('-50', '').trim() :
e.sku.startsWith('PD-1000') ? e.sku.replace('PD-1000','PD-1000-') : //this doesnt work
e.sku.startsWith('PD-1007') ? e.sku.replace('PD-1007','PD-1007-') : //this
e.sku.startsWith('PD-1042') ? e.sku.replace('PD-1042','PD-1042-') : //this
e.sku,

任何以PD-开头的sku都将匹配第一个表达式,因此永远不会针对PD-1000等进行测试。先处理其他条件比较容易,例如:

sku = e.sku.startsWith('PD-1007') ? e.sku.replace('PD-1007','PD-1007-') :
e.sku.startsWith('PD-1042') ? e.sku.replace('PD-1042','PD-1042-') :
e.sku.startsWith('PD-1000') ? e.sku.replace('PD-1000','PD-1000-') :
e.sku
return {
sku: sku.startsWith("PD-") ? sku.replace("S/A", "").trim() :
sku.startsWith('KL') ? sku.replace('.', '').trim() :
sku.startsWith('BD') ? sku.replace('-50', '').trim() :
sku,
price: typeof e.price === "undefined" ? "0" : e.price,
};

请注意,您可以使用regex进行其他改进,例如

sku = e.sku.replace(/^(PD-d{4})/, '$1-')

工作代码:

const arr1 = [
{ sku: '003CON', price: undefined },
{ sku: 1000, price: 2215.49 },
{ sku: 1001, price: 2215.49 },
{ sku: 'PD-1000B', price: undefined },
{ sku: 'PD-1007A', price: 2195.14 },
{ sku: 'PD-1042A', price: 2495.29 },
{ sku: 'BD111-50', price: 2495.29 },
{ sku: 'BD222-50', price: 2495.29 },
{ sku: 'BD333', price: 2495.29 },
{ sku: 'KL.213', price: 2495.29 },
{ sku: 'KL.312', price: undefined },
{ sku: 1005, price: 2495.29 },
{ sku: 5343, price: undefined },
{ sku: 1231, price: undefined },
{ sku: 3542, price: 2495.29 },
{ sku: 6756, price: 2495.29 },
{ sku: 7685, price: undefined },
{ sku: 1076, price: 2495.29 },
] 
var what = arr1.map((e) => {
if (typeof e.sku === 'string') {
return {
sku: e.sku.startsWith("PD-") ? e.sku.replace("S/A", "").trim() :
e.sku.startsWith('KL') ? e.sku.replace('.', '').trim() :
e.sku.startsWith('BD') ? e.sku.replace('-50', '').trim() :
e.sku,
price: typeof e.price === "undefined" ? "0" : e.price,
};
}
else {
return {
sku: e.sku,
price: typeof e.price === 'undefined' ? '0' : e.price
}
}
});
what.forEach(e => {
if (typeof e.sku === 'string') {
if (e.sku.includes('PD-1000B')) {
e.sku = 'PD-1000-B'
}
if (e.sku.includes('PD-1007A')) {
e.sku = 'PD-1007-A'
}
if (e.sku.includes('PD-1042A')) {
e.sku = 'PD-1042-A'
}
}
})
console.log(what)
var what2 = arr1.map((e) => {
if (typeof e.sku === 'string') {
sku = e.sku.startsWith('PD-1007') ? e.sku.replace('PD-1007','PD-1007-') :
e.sku.startsWith('PD-1042') ? e.sku.replace('PD-1042','PD-1042-') :
e.sku.startsWith('PD-1000') ? e.sku.replace('PD-1000','PD-1000-') :
e.sku
return {
sku: sku.startsWith("PD-") ? sku.replace("S/A", "").trim() :
sku.startsWith('KL') ? sku.replace('.', '').trim() :
sku.startsWith('BD') ? sku.replace('-50', '').trim() :
sku,
price: typeof e.price === "undefined" ? "0" : e.price,
};
}
else {
return {
sku: e.sku,
price: typeof e.price === 'undefined' ? '0' : e.price
}
}
});
console.log(what2)

最新更新