Почему в начале моей строки есть «неопределенный» текст?

#javascript #html #jquery

#javascript

Вопрос:

У меня есть функция, которая объединяет результаты запроса AJAX.

По какой-то причине моя последняя строка начинается с «undefined».

Вот упрощенный пример, который воспроизводит проблему:

     // In practice, fetched via AJAX from a server
    var vendors = [{ id_vendor: 'V0001' }, { id_vendor: 'V0002' }];

    var row_vendor;

    vendors.forEach(function (value) {
      row_vendor  = value.id_vendor;
    });
	
    alert(row_vendor); // undefinedV0001V0002  

Почему предупрежденное значение отображает начальное «неопределенное»?

Ответ №1:

Вы не инициализируете свою переменную, поэтому ее значение равно undefined . Объединение строки приводит ее к строке "undefined" перед конкатенацией.

Рассмотрим:

 var x
alert(x   "test") // undefinedtest
  

Вместо этого инициализируйте свою переменную пустой строкой перед выполнением конкатенации:

 var x = ""
alert(x   "test") // test
  

Обратите внимание, что функционально гораздо проще сначала извлечь интересующее вас свойство, а затем просто join объединить их вместе:

 $.map(vendor, function (v) { return v.vendor_id }).join('')
  

Ответ №2:

Вашей row_vendor переменной не присвоено начальное значение, поэтому она запускается, undefined а затем с помощью = оператора для объединения строки результат undefined становится строкой "undefined" (плюс "v0001" ). Просто установите для него значение пустой строки при ее объявлении:

 var row_vendor = "";
  

Ответ №3:

Проблема в этой строке

 $.each(vendor, function(i, value) {
  row_vendor  = value.id_vendor;
});
  

Чтобы использовать row_vendor для целей конкатенации, сначала вам нужно присвоить ему значение по умолчанию. Итак, что вам нужно сделать, это:

 var row_vendor = ""; // set it to empty string by default
$.each(vendor, function(i, value) {
   row_vendor  = value.id_vendor;
});
  

В боковой заметке вы также можете объединить строку с помощью массива. Я предпочитаю так, потому что это более красиво и читаемо.

 var row_vendor = []; // empty array
$.each(vendor, function(i, value) {
   row_vendor.push(value.id_vendor);
});
console.log(row_vendor.join(",")); // this will separate each value with a comma