2016-08-29 3 views
0

Мне нужна небольшая помощь. У меня возникли проблемы с получением массива (larray3), заполненного двумя другими объектами массива (larray1 и larray2), чтобы передать оба из data.js в последующие model.js и view.js. Data.js правильно строит многомерный массив, однако, когда результаты получены в model.js/view.js, я получаю только результаты для larray1. Потому что только первые значения приходят через я не могу сказать, проходят ли как larray1, так и larray2 через. Может кто-нибудь, пожалуйста, скажите мне, как я должен изменить свой синтаксис в файлах model.js или view.js для доступа к значениям массива или тому, что еще я могу изменить? Заранее спасибо.Получение значений массива из многомерного массива в JavaScript

данные.js.

function getCountries(done) { 
var sqlite3 = require('sqlite3').verbose(); 
var file = 'db/locations.sqlite3'; 
var db = new sqlite3.Database(file); 
var larray1 = []; 
var larray2 = []; 
var larray3 = []; 

db.all('SELECT * FROM Country', function(err, rows) { 
    // This code only gets called when the database returns with a response. 
    rows.forEach(function(row) { 
     larray1.push(row.CountryName); 
     larray2.push(row.CountryCode); 
    }) 
larray3.push(larray1); 
larray3.push(larray2); 
return done(larray3[0], larray3[1]); 
}); 
db.close(); 
} 

model.js

function Countries(done) { 
//Pull location values from data 
return getCountries(done); 
} 

view.js

function viewCountries() { 

var viewCou = Countries(function(results) { 
    // Code only gets triggered when Countries() calls return done(...); 
    var container = document.getElementById('country-select'); 
    var fragment = document.createDocumentFragment(); 

    results.forEach(function(loc, index) { 
     var opt = document.createElement('option'); 
     opt.innerHTML = loc; 
     opt.value = loc; 
     fragment.appendChild(opt); 
    }); 
    container.appendChild(fragment); 
}) 
} 

ответ

1

В data.js отправляемые два аргумента в done обратного вызова:

return done(larray3[0], larray3[1]); 

Эта функция done это p оценочные через в вашем model.js:

return getCountries(done); 

и что done передается из view.js:

Countries(function(results) { // ... 

Так что это анонимная функция (function(results) {...}), которая вызывается в data.js. Но обратите внимание, что эта функция имеет только один параметр, поэтому вы ничего не делаете со вторым аргументом, который отправляет data.js. result получает значение larray3[0], но larray3[1] не попадает нигде.

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

Вместо того, чтобы массив объектов, и передать этот один массив вокруг:

В data.js:

rows.forEach(function(row) { 
    larray1.push({ 
     name: row.CountryName, 
     code: row.CountryCode 
    }); 
}) 
return done(larray1); 

В view.js:

opt.textContent = loc.name; 
    opt.value = loc.code; 

Side-примечание: .textContent является предпочтительным по сравнению с .innerHTML при назначении простого текста.

+0

спасибо. Я попытался что-то похожее на спаривание ключевых значений, но я знаю, что я не реализовал право. Это отлично поработало. Я также рассмотрю .textcontent. Вы очень благодарны за помощь! – Steve

Смежные вопросы