#javascript #node.js #arrays #function #discord.js
#javascript #массивы
Вопрос:
Я пытаюсь отредактировать весь массив, запуская функцию для каждого элемента в нем, которая проверяет, есть ли у него двойная кавычка в качестве первого символа, а затем вырезает ее. Код для этого выглядит следующим образом:
args = args.map(function(arg){
if(arg.substring(0, 1) === """){
return arg.substring(1)
}
});
Когда я запускаю этот код, я получаю возврат со следующей ошибкой:
index.js:97
if(arg.substring(arg.length()-1, arg.length()) === """){
^
TypeError: Cannot read property 'substring' of undefined
Параметр функции обычно можно использовать в if
инструкции внутри функции, поэтому я не знаю, почему он возвращается undefined
здесь. В этом списке действительно есть элементы.
Комментарии:
1. не могли бы вы добавить сам массив?
2. Что находится в массиве? Строки? Что-то еще? Вы должны убедиться, что элементы в массиве имеют тот тип, который вы хотите, чтобы они были, чтобы
.map
функция работала.
Ответ №1:
Похоже, что ваш массив args содержит элементы типа, отличного от string. Поэтому убедитесь, что элементы массива args являются строками.
Если вы пытаетесь создать массив только из тех элементов, которые начинаются с двойной кавычки (конечно, после удаления этой двойной кавычки), map()
это плохой выбор, поскольку это добавит undefined
к результирующему массиву. forEach()
было бы лучшим выбором в таком случае.
var newArgs = [];
args.forEach(arg => {
if(arg[0] === '"'){
newArgs.push(arg.substring(1));
}
});
Если вы пытаетесь создать массив, в котором у вас будут все элементы в аргументах, но некоторые элементы args с удаленными двойными кавычками (если это первый символ), то map()
это хороший выбор, но он используется неправильно.
args = args.map(function(arg){
if(arg.substring(0, 1) === """){
return arg.substring(1);
}
// what if the above `if` statement is false?
// This function is not returning anything in such case.
});
Правильное использование было бы:
args = args.map(arg => (arg[0] === '"') ? arg.substring(1): arg);
var args = ['test1', '"test2', 'test3', '"test4', '"test5'];
var newArgs = [];
args.forEach(arg => {
if(arg[0] === '"'){
newArgs.push(arg.substring(1));
}
});
console.log('forEach: ' newArgs);
// returns ["test2", "test4", "test5"]
// Your code in question:
newArgs = args.map(function(arg){
if(arg.substring(0, 1) === """){
return arg.substring(1);
};
});
console.log('Your code: ' newArgs);
// returns [undefined, "test2", undefined, "test4", "test5"]
// If you want to get all elements but with double quote removed (if present as first character
newArgs = args.map(arg => (arg[0] === '"') ? arg.substring(1): arg);
console.log('proper map: ' newArgs);
// returns ["test1", "test2", "test3", "test4", "test5"]
Ответ №2:
например, если у вас есть:
args = ["a","b",'"c"'];
args = args.map(arg=>arg.slice(0,1)=='"'?arg.slice(1,-1):arg)
его возврат
["a", "b", "c"]
Ответ №3:
Вы используете функцию map для пустого массива. Итак, вам просто нужно заполнить массив args некоторыми значениями, прежде чем пытаться вызвать map для него.
Ответ №4:
Ошибка типа: не удается прочитать свойство ‘substring’ неопределенного
вы сопоставляете массив, который содержит неопределенный элемент с определенным индексом, теперь в этом случае перед использованием любой функции вам нужно убедиться, что arg не является неопределенным, например :
args = args.map(function(arg){
if(arg!==undefined){
if(arg.substring(0, 1) === """){
return arg.substring(1)
}
}
})
это позволит убедиться, что вы не используете какую-либо функцию-член для неопределенного элемента, надеюсь, это поможет!
Ответ №5:
Предполагая, что у вас есть массив, который выглядит следующим образом ['"item1"', 'item2', '"item3"', 'item4'];
let arr = ['"item1"', 'item2', '"item3"', 'item4'];
let newArr = arr.filter(element => (/^[^"]/).test(element.trim()))
console.log(newArr); // item2, item4