在javascript

时间:2018-10-19 06:30:52

标签: javascript node.js

我有一个包含字符串和数字的数组。我知道哪个数组索引将包含数字,哪个数组将包含字符串。有没有比这更好的方法来验证类型了? 数组中的所有值都将存储为字符串,但是对于这些值,我希望是整数,它应该是以字符串格式存储的有效数字。如果需要一个字符串,则它必须是任何字符串,并且不能是数字(可以是字母数字)。

说数组中只能有5个索引:

[0]-> Integer
[1] -> String
[2] -> String
[3] -> Integer
[4] -> String

var validArray = ["145", "test1", "test", "1233", "blah"];

function validateArray() {
   if(isNaN(validArray[0]) || isNaN(validArray[3])) {
      return false;
   }
   if(!isNaN(validArray[1]) || !isNaN(validArray[2] || !isNaN(validArray[4])) {
      return false;
   }

}

其他选择是我可以拆分为多个if语句,以便知道导致该问题的索引。

在NodeJS中,有没有更清洁的方法? (验证数组并指示哪个索引引起问题,如果存在任何错误)。

3 个答案:

答案 0 :(得分:1)

我将通过创建一个更通用的验证函数来解决这个问题,然后我们可以将其用作不同形状数据的验证器。

// Expected shape
const t = [
  "Number",
  "String",
  "String",
  "Number",
  "String",
]

// Test data - valid
const d = ["1", "a", "b", "2", "c"]
// Test data - invalid
const dInvalid = ["b", "a", "b", "2", "c"]

function validate(data, types) {
  // Map through shape
  return types.map((item, i) => {
    switch(item){
      // Switch by type and do expected comparison
      case "Number": return !Number.isNaN(Number(data[i]))
      case "String": return Number.isNaN(Number(data[i]))
      default: return false // Example defaults to false which might not be what you want 
    }
  })
}

console.log(validate(d, t)) // => [true, true, true, true, true]
console.log(validate(dInvalid, t)) // => [false, true, true, true, true]

//If want to check array validity
const valid = validate(d, t)

console.log(valid.every(item => item === true)) // => true
// OR
console.log(!valid.includes(false)) // true
  

编辑。添加了返回无效索引的功能

function invalidIndexes(data){
  let indexes = []
  data.forEach((item, i) => {
    if(item === false){ indexes.push(i) }
  })
  return indexes // example output. [1,3]
}

答案 1 :(得分:0)

这可能是本机更干净的方法:

function arrayIsValid(arr) {
  return [0, 3].every(function(n){return Number.isInteger(parseInt(arr[n], 10))}) &&
         [1, 2, 4].every(function(n){return typeof arr[n] == 'string' && !Number.isInteger(parseInt(arr[n], 10))})
};

作为ES6:

function arrayIsValid(arr) {
  return [0, 3].every(n => Number.isInteger(parseInt(arr[n], 10))) &&
         [1, 2, 4].every(n => typeof arr[n] == 'string' && !Number.isInteger(parseInt(arr[n], 10)))
};

如果字符串和整数位置的相应索引不同,则可以用包含相关索引的变量替换静态数组。

答案 2 :(得分:0)

如果每个索引的类型都是预先定义的或预先知道的,则可以使用Map来捕获针对特定类型的预期索引。 Key可以是表示特定类型的任何内容,例如在下面的示例中,我使用true定义Numberfalse定义String(您已经在您的帖子中已经提到只有数字和字符串)。

var typed = new Map();
typed.set(true, [0, 3]);
typed.set(false, [1, 2, 4]);
var validArray = ["145", "test1", "test", "1233", "blah"];
var invalidArray = ["145test", "test1", "test", "1233", "blah"];

function validate(validArray) {
  for (var i = 0; i < validArray.length; i++) {
    var type = !isNaN(validArray[i]);
    if (!typed.get(type).includes(i)) {
      return false;
    }
  }
  return true;
}
console.log(validate(validArray));
console.log(validate(invalidArray));

使用上述功能,您还将知道哪个index验证失败。

希望这会有所帮助!