#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);
}
Комментарии:
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);
}
}