这个减速机有什么问题

时间:2017-08-31 23:51:23

标签: javascript arrays

我希望最终结果应具有该值。

"错误:无效的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)




3 个答案:

答案 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参数。