我有一个包含字符串和数字的数组。我知道哪个数组索引将包含数字,哪个数组将包含字符串。有没有比这更好的方法来验证类型了? 数组中的所有值都将存储为字符串,但是对于这些值,我希望是整数,它应该是以字符串格式存储的有效数字。如果需要一个字符串,则它必须是任何字符串,并且不能是数字(可以是字母数字)。
说数组中只能有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中,有没有更清洁的方法? (验证数组并指示哪个索引引起问题,如果存在任何错误)。
答案 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
定义Number
和false
定义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
验证失败。
希望这会有所帮助!