2013-06-28 2 views
0

У меня есть 2 javascript-запроса, которые возвращают результаты в массив объектов.Объединить объекты в 2 разных массивах javascript

Первый объект выглядит следующим образом:

[Object {user_id="6", meta_value="5", user_nicename="richbai90", more...}, 
Object {user_id="7", meta_value="1", user_nicename="testing123", more...}] 

2-го выглядит следующим образом

[Object { usr="6", score="1/1", quiz_id="1"}, 
Object { usr="7", score="1/1", quiz_id="1"}, 
Object { usr="7", score="1/5", quiz_id="3"}] 

массив 2 является детали массива один

Что мне нужно, это способ связать они вместе в javascript, чтобы я мог поместить информацию из объекта 2 в документ, где он должен соответствовать информации из одного объекта. Самый простой способ, который я мог бы подумать, - объединить массивы, в которых идентификаторы пользователей были одинаковыми, но это кажется более сложным, чем я сначала подумал. Здесь был мой первоначальный подход:

 $.post(AjaxRequest.ajaxurl, { 
action: "get_data" 
}) 
.done(function (json) { 

console.log(json); 
var data = json; 


for (var i = 0; i < json.length; i++) { 
    if (AjaxRequest.user_ID == json[i].user_id && json[i].Quizes == "1") { 
     $("#result_list").append("you have taken " + json[i].Quizes + " quiz"); 
    } else if (AjaxRequest.user_id == json[i].user_id && json[i].Quizes != "1") { 
     $("#result_list").append("you have taken " + json[i].Quizes + " quizzes"); 
    } else { 
     $("#result_list").append(json[i].user_nicename + " has taken " + json[i].Quizes + " quizzes" + "<br>"); 
    } 

} 



getDetails(json); 






}) 

.fail(function (jqxhr, textStatus, error) { 
var err = textStatus + ', ' + error; 
console.log('1st Request Failed: ' + err); 
}); 




function getDetails(data) { 

$.post(AjaxRequest.ajaxurl, { 
    action: "get_details" 

}) 
    .done(function (details) { 

    console.log(data); 
    console.log(details); 

    for (var i = 0; i < data.length; i++) { 
     for (var i2 = 0; i2 < details.length; i++) { 
      while (details[i2].usr == data[i].user_id) { 
       console.log(details[i2]); 
       break; 
      } 
     } 


    } 




    $("#loading").fadeOut('fast', function() { 
     $("#result_list").fadeIn('fast'); 
    }); 

}) 

    .fail(function (jqxhr, textStatus, error) { 
    var err = textStatus + ', ' + error; 
    console.log('2nd Request Failed: ' + err); 
}); 


} 

В этом коде блока, где работа происходит

for (var i = 0; i < data.length; i++) { 
     for (var i2 = 0; i2 < details.length; i++) { 
      while (details[i2].usr == data[i].user_id) { 
       console.log(details[i2]); 
       break; 
      } 
     } 


    } 

Вопрос заключается в том, что после того, как цикл в то время как ломает это, кажется, не перейти к следующему itteration цикла for, как я ожидал бы, вместо этого данные [i] становятся неопределенными. Если я удалю перерыв; то данные [i] всегда == детали [i2] и, таким образом, сбой браузера.

Возможно, я делаю это сложнее, чем нужно?

+0

Я не уверен, правильно ли понимаю ваш вопрос, но почему бы вам просто не использовать двумерный массив? – cruxi

+1

Я думаю, я мог бы просто объединить массивы в php, прежде чем я когда-либо отправлю результат, и это будет намного проще. Извините за то, что вы сделали это сложнее, но это должно быть, но если вы опубликуете ответ, я добавлю +1 за то, что помогли мне – richbai90

ответ

1

Вы можете попробовать использовать двумерный массив.

+0

. 2-мерные массивы в javascript - это большая часть времени, и объект обычно лучше подходит. – KKetch

+0

@KKetch: если вам не нравится [] .map/[]. Filter/[]. Уменьшить, и в этом случае вы сможете конвертировать объекты в массивы точно в срок, чтобы сделать все ... – dandavis

+0

@dandavis Да javascript не имеет, map/reduce & cie на объекте, но я не вижу, почему объекты должны быть преобразованы в массив для обхода их, 'for (var key in object) {}' должно быть достаточно – KKetch