Проверка содержимого массива на тип данных js
Вопрос к знатокам: как сделать проверку на тип данных в массиве, чтобы эта проверка не проверяла тип данных самих переменных массива? То есть, есть у меня массив:
let BB = 'ccc';
let arr = ['aaa','ggg', BB,'']
А есть у меня функция, которая пробегается по массиву и выполняет некоторые действия, в зависимости от типа данных элементов массива. В конкретном данном случае, привязка идет к строке:
function change() {
let a = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] == '' || typeof arr[i] != 'string') {
a[i] = arr[i]
} else {
a[i] = getSummary(arr[i]) // здесь производятся некоторые вычисления в зависимости от того, какая строка содержалась в массиве.
}
}
return a;
}
console.log(a);
// итоговый массив получается вот такой: true, true, undefined, ''
// а нужно чтобы получилось: true, true, 'ccc', ''
И все бы хорошо, но мне нужно, чтобы когда алгоритм натыкался на ВВ, он в итоговый массив записывал 'ccc' вместо себя, однако он проверяя массив на тип данных, так же проверяет ВВ и выяснив, что тот тоже содержит строку, пытается применить к нему getSummary(arr[i]), но так как под эту строку нет прописанных действий, естественно, что результат выпадает в ошибку.
Итак, повторю свой вопрос, как мне проверить массив на тип данных, при этом не проверяя типа данных переменных, которые в нем содержаться? То есть должно получится, если строка, то выполняем указанное действие, если что-то другое (например, переменная типа строка), то игнорируем это. Методы isNaN() и typeof не помогли, так как они все равно заглядывают в тип данных переменной.
Ответы (2 шт):
Как вариант, можно добавить в условие проверку с заданной переменной:
let BB = 'ccc';
let arr = ['aaa','ggg', BB,'']
function change() {
let a = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] == '' || typeof arr[i] != 'string' || arr[i] == BB) {
a[i] = arr[i]
} else {
a[i] = getSummary(arr[i]) // здесь производятся некоторые вычисления в зависимости от того, какая строка содержалась в массиве.
}
}
return a;
}
console.log(a);
// получилось: true, true, 'ccc', ''
вот только если таких переменных несколько, то для каждой нужно будет прописывать проверку, что не очень удобно и гибко
========================================
Второй вариант, добавить массив допустимых значений для getSummary и каждый раз при вводе нового элемента в функцию, проверять, является он в списке допустимых:
let BB = 'ccc';
let arr = ['aaa','ggg', BB,'']
let arr2 = ['aaa','ggg']
function change() {
let a = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] == '' || typeof arr[i] != 'string') {
a[i] = arr[i]
} else {
for (var j = 0; j < arr2.length; j++) {
if (arr2[j] === arr[i]) {
a[i] = getSummary(arr[i])
}
}
}
return a;
}
console.log(a);
// получилось: true, true, 'ccc', ''
Сделайте массив исключений и будет Вам счастье
const arr = ['a', 'b', 'c', 'd', 'e']
const exeption = ['c', 'd']
const result = arr.reduce((acc, el) => {
exeption.includes(el) ? acc.push(el) : acc.push(getSummary(el))
return acc
}, [])
function getSummary(item) {
return true
}
console.log(result);