声明req.body后转换为双精度数组

时间:2018-12-01 16:15:52

标签: javascript arrays node.js

我正在尝试为一个变量(可能是一个id或多个id的数组)启动foreach。首先,我尝试验证其是否为数组,如果不是,则将其声明为仅包含1个项目的数组。

router.post("/providerQuote", function (req, res) {
  console.log(req.body.idQuote);
  var idQuote = [];
  if(req.body.idQuote.isArray)
  {
    idQuote = Object.values(req.body.idQuote);
  }else{
    idQuote = [req.body.idQuote];
  }
  console.log(idQuote);
  idQuote.forEach(function (quote){
    console.log(quote);
    });

这是控制台日志:

Server Started...
[ '5bfed54c9b0d061574d874c0', '5bfed54c9b0d061574d874bf' ]
[ [ '5bfed54c9b0d061574d874c0', '5bfed54c9b0d061574d874bf' ] ]
[ '5bfed54c9b0d061574d874c0', '5bfed54c9b0d061574d874bf' ]

这里的问题是,它以某种方式将req.body插入另一个数组。

2 个答案:

答案 0 :(得分:0)

据我的理解,响应中的idQuote值可能是字符串,也可能是字符串数组,而您试图始终只包含一个字符串数组。如果我的说法是正确的,则只需将您的代码更改为以下内容:

router.post("/providerQuote", function (req, res) {
  console.log(req.body.idQuote);
  var idQuote = req.body.idQuote;
  if(!Array.isArray(idQuote)) {
    idQuote = [idQuote];
  }

  console.log(idQuote);
  idQuote.forEach(function (quote){
    console.log(quote);
    });

如果您的idQuote当前不是数组,它将简单地包装在数组中。

通过将idQuote变量默认为req.body.idQuote,我正在做一些事情:

  1. 我正在简化代码。如果idQuote实际上是一个数组,则没有其他事情要做!我们很好。
  2. 当我们需要使用任一种方式时,我们不会重复输入req.body.idQuote多次。编程中有一个缩写词叫做DRY,意思是“不要重复自己”。如果您发现自己多次做同一件事,则可能有一种简化代码的方法。
  3. 我避免进行过多处理。您的原始代码创建了一个空数组,然后用另一个数组的值填充了它。完全没有冒犯您的意思,但是当您有一个看起来非常精确的数组时,这是很多不必要的工作(在内存中创建一个全新的数组对象,然后遍历一个数组将其值复制到一个新数组中)您想要的方式。 过多的处理会浪费金钱:在服务器上,这意味着您将需要更快地使用一台更大的服务器,因为如果事情效率更高,您将无法处理尽可能多的事情。在客户端上,过多的处理意味着电池耗尽,有时用户体验会比较不稳定。寻找可以改进的小事情是一件好事,因为尽管一件小事并不重要,但是如果您的代码中有很多事,它们可以迅速加起来,尤其是当它们处于漫长的循环中时。您可以从中学习一些小技巧,对您有很大帮助。

也知道isArray是Array上的方法。由于没有括号,因此您基本上是在检查当前对象是否具有isArray方法,并且我非常有信心它都没有(因为它是Array类上的静态方法),这随后使您失望放入将其包裹在数组中的else中。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

答案 1 :(得分:0)

我认为您可以尝试

if ( Array.isArray(req.body.idQuote) ) {
  // Perform your operations here
} else {
  idQuote.push(req.body.idQuote)
}