我希望最终结果应具有该值。
"错误:无效的UpdatableBy类型得到了heLlo1"
相反,它甚至不打印任何控制台消息或进入reduce功能。我可以使用foreach做到这一点,但想到使用reduce方法尝试这个。
t中的最终输出是" heLl01"
pobject = {
UpdatableBy: ["heLlo1"]
}
let t;
let updatedUpdatableBy = []
t = pobject.UpdatableBy.reduce((allerrors, val) => {
console.log(allerrors)
console.log(val)
if (typeof val !== "string") {
allerrors += "Error: Invalid UpdatableBy data type got " + typeof val
} else {
if (val.toUpperCase() == "HELLO") {
updatedUpdatableBy.push("Hello")
} else if (val.toUpperCase() == "HI") {
updatedUpdatableBy.push("Hi")
console.log("Hi")
} else if (val.toUpperCase() == "HOW") {
updatedUpdatableBy.push("How")
console.log("How")
} else {
allerrors += "Error: Invalid UpdatableBy type got " + val
console.log(allerrors)
}
}
return allerrors
});
console.log(t)

答案 0 :(得分:1)
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
arr.reduce(callback[, initialValue])
initialValue [可选]
用作第一个参数的值 第一次回调。 如果没有提供初始值,则第一个 将使用数组中的元素。在空数组上调用reduce 没有初始值是一个错误。
所以你需要传递initialValue以追加到,在你的情况下是一个空字符串。
pobject = {
UpdatableBy: ["heLlo1"]
}
let t;
let updatedUpdatableBy = []
t = pobject.UpdatableBy.reduce((allerrors, val) => {
if (typeof val !== "string") {
allerrors += "Error: Invalid UpdatableBy data type got " + typeof val
} else {
if (val.toUpperCase() == "HELLO") {
updatedUpdatableBy.push("Hello")
} else if (val.toUpperCase() == "HI") {
updatedUpdatableBy.push("Hi")
console.log("Hi")
} else if (val.toUpperCase() == "HOW") {
updatedUpdatableBy.push("How")
console.log("How")
} else {
allerrors += "Error: Invalid UpdatableBy type got " + val
}
}
return allerrors
}, "");
console.log(t)
答案 1 :(得分:0)
reducer的累加器需要有一个值开始追加到:
[].reduce((acc, next) => {}, defaultAcc)
在这种情况下,""
pobject = {
UpdatableBy: ["heLlo1"]
}
let t;
let updatedUpdatableBy = []
t = pobject.UpdatableBy.reduce((allerrors, val) => {
if (typeof val !== "string") {
allerrors += "Error: Invalid UpdatableBy data type got " + typeof val
} else {
if (val.toUpperCase() == "HELLO") {
updatedUpdatableBy.push("Hello")
} else if (val.toUpperCase() == "HI") {
updatedUpdatableBy.push("Hi")
console.log("Hi")
} else if (val.toUpperCase() == "HOW") {
updatedUpdatableBy.push("How")
console.log("How")
} else {
allerrors += "Error: Invalid UpdatableBy type got " + val
}
}
return allerrors
// here
}, "");
console.log(t)
答案 2 :(得分:0)
如果数组只有1个元素,并且initialValue
没有reduce()
参数,则它不会打扰调用该函数,它只返回该单个值。来自MDN:
如果数组只有一个元素(无论位置如何)并且没有提供
initialValue
,或者提供initialValue
但是数组为空,则将返回的独奏值致电callback
。
这是因为该函数应该将数组元素与先前迭代的累积结果相结合。如果只有一个元素,则没有累积结果与它组合。 initialValue
是第一次迭代时使用的默认值,但如果没有提供,则根本无法调用该函数。
由于您通过将结果连接成字符串来累积结果,因此可以使用""
作为initialValue
参数。