Не удается использовать метод `substring` для элемента массива в `.map`

#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