Повторяющиеся значения в массиве приводят к появлению неопределенного

#javascript #arrays

#javascript #массивы

Вопрос:

Я создавал js-код, который получает элементы из массива. Одна проблема: элементы с одинаковым значением возвращают undefined или исчезают. Я пробовал много разных вещей, но ничего не работает. Вот jsfiddle: https://jsfiddle.net/76e40vqg/5 /

 var data =
    [{"image":"link1","name":"Name1","address":"Address1","rate":"4.4"},
    {"image":"link2","name":"Name2","address":"Address2","rate":"3.3"},
    {"image":"link3","name":"Name3","address":"Address3","rate":"3.3"}
];

var restoName = [];
for(i = 0; i < data.length; i  ){    
    if(restoName.indexOf(data[i].name) === -1){
        restoName.push(data[i].name);        
    }        
}

var restoAddress = [];
for(i = 0; i < data.length; i  ){    
    if(restoAddress.indexOf(data[i].address) === -1){
        restoAddress.push(data[i].address);        
    }        
}

var restoRate = [];
for(i = 0; i < data.length; i  ){    
    if(restoRate.indexOf(data[i].rate) === -1){
        restoRate.push(data[i].rate);        
    }        
}

var restoImage = [];
for(i = 0; i < data.length; i  ){    
    if(restoImage.indexOf(data[i].image) === -1){
        restoImage.push(data[i].image);
    }        
}

for(i = 0; i < restoName.length; i  ){
document.getElementById('output').innerHTML  = "Image : <a href='"   restoImage[i]   "'><div class='thumb' style='background-image:"   'url("'   restoImage[i]   '");'   "'></div></a><br>"   "Name : "   restoName[i]   "<br>"   "Address : "   restoAddress[i]   "<br>"   "Rate : "   restoRate[i]   "<br>"   "Index"   "<br><hr>";
  }
  

Комментарии:

1. вы опубликовали входной массив, не могли бы вы опубликовать ожидаемый результат

Ответ №1:

Этот фрагмент кода в скрипке JS:

 if (restoRate.indexOf(data[i].rate) === -1)
{
    restoRate.push(data[i].rate);
}
  

Буквально, если значения нет 3.3 , вставьте его restoRate . В противном случае не нажимайте на него.

Другими словами, второе 3.3 значение не передается, потому что это то, что вы хотите (реализовали), и, следовательно, для index 3 нет значения, и вы получаете undefined .


РЕДАКТИРОВАТЬ: предлагаемое решение, которое, вероятно, является недостаточным

Чтобы исправить это, не проверяйте уникальность, просто так (без окружения if() ):

 restoRate.push(data[i].rate);
  

Неясно, нужно ли вам это в дальнейшем в вашем коде, поэтому, вероятно, вам нужно переосмыслить некоторые части вашего кода. В этом мы не можем вам помочь, или, лучше, это требует другого, точного вопроса с другим кодом.


РЕДАКТИРОВАТЬ 2: лучшее решение с уникальностью

Вы добавили проверку на уникальность, поэтому, вероятно, она вам все еще нужна. Первый шаг, который вы должны сделать, это решить, что является ключом. Возможно, вы захотите добавить id , потому что люди могут иметь одно и то же имя, но все равно быть разными людьми, если вы понимаете, что я имею в виду:

 {"id": 45, "image":"link1","name":"Name1","address":"Address1","rate":"4.4"},
{"id": 46, "image":"link2","name":"Name1","address":"Address2","rate":"4.1"}
  

В этом примере показаны две записи с одинаковым именем, но два совершенно разных случая. Это id фактический ключ, который вы используете для различения записей.

Если вы сделаете это, вы должны проверить id уникальность:

 if (restoId.indexOf(data[i].id) === -1) // this id is new
{
    restoId.push(data[i].id);
    restoImage.push(data[i].image);
    restoName.push(data[i].name);
    restoAddress.push(data[i].address);
    restoRate.push(data[i].rate);
}
  

Если вы не можете добавить id , вы, вероятно, должны name использовать, например:

 if (restoName.indexOf(data[i].name) === -1) // this id is new
{
    restoImage.push(data[i].image);
    restoName.push(data[i].name);
    restoAddress.push(data[i].address);
    restoRate.push(data[i].rate);
}
  

Это может быть или не быть тем, что вам нужно. Никто не может сказать без фактических данных и полного кода.

Комментарии:

1. Хорошо, спасибо за ваше объяснение. Как я могу это исправить?

2. Послушайте, я добавил решение, но его, вероятно, недостаточно.

3. конечно, он может. Вы можете поместить в массив все, что вам нравится. ему просто нужно удалить окружающие ifs.

4. Извините, я удалил свой комментарий. да, он может нажать

5. Круто, теперь это работает. Возникнут ли у меня дополнительные проблемы, если я использую это?

Ответ №2:

Я вижу, что вы целенаправленно избегаете дубликатов, помещая

if(restoRate.indexOf(data[i].rate) === -1)

Если вы удалите эту проверку, проблем с отображением повторяющегося кода не возникнет.

Я также думаю, что вы можете добавить их все вместе и поставить галочку, чтобы избежать дублирования имен. Как показано ниже :

  if(restoName.indexOf(data[i].name) === -1){
    restoName.push(data[i].name); 
    restoAddress.push(data[i].address);
    restoRate.push(data[i].rate);
    restoImage.push(data[i].image);
}   
  

Пожалуйста, проверьте этот jsfiddle для реализации

Комментарии:

1. Это отвечает на ваш вопрос? Потому что здесь не упоминается конкретный вывод.

2. На самом деле нет, потому что есть if . Но кроме этого, для размера скрипта лучше

Ответ №3:

Ваш код, работающий так, как вы написали restoRate.indexOf(data[i].rate) === -1 , означает, что ваш массив не содержит никаких значений. Например

 var array = [2, 9, 9];
array.indexOf(2);     // 0
array.indexOf(7);     // -1
array.indexOf(9, 2);  // 2
array.indexOf(2, -1); // -1
array.indexOf(2, -3); // 0
  

Пожалуйста, проверьте концепцию indexOf в javascript

Ответ №4:

Вы не вставляете повторяющееся значение в свой массив rate if(restoRate.indexOf(data[i].rate) === -1) , поэтому на дисплее отображается сообщение undefined.

Кроме того, попробуйте реализовать все, не создавая 4 новых цикла for . Я думаю, что это можно сделать без создания каких-либо новых переменных массива и повторения только исходного массива. Большой O будет меньше, а производительность будет хорошей.

 var restoRate = [];
for(i = 0; i < data.length; i  ){    
    if(restoRate.indexOf(data[i].rate) === -1){
        restoRate.push(data[i].rate);        
    }        
}