2016-08-29 4 views
0

약간의 도움이 필요합니다. 두 개의 다른 배열 객체 (larray1 및 larray2)로 채워진 배열 (larray3)을 가져 오는 중 문제가 발생하여 data.js와 다음 model.js 및 view.js를 모두 전달합니다. Data.js는 다차원 배열을 올바르게 만듭니다. 그러나 model.js/view.js에서 결과를 받으면 larray1에 대한 결과 만받습니다. 처음 값만 올 수 있기 때문에 larray1과 larray2가 실제로 통과하는지 알 수 없습니다. 누군가가 model.js 또는 view.js에서 구문을 변경하여 배열 값에 액세스하거나 다른 것을 변경할 수 있는지 알려주실 수 있습니까? 미리 감사드립니다.JavaScript의 다차원 배열에서 배열 값 가져 오기

data.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 data.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

당신이 done 콜백에 두 개의 인수를 보내

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

done 기능 P이다. 당신의 model.js에 통해 개다 : view.js에서 전달되는

return getCountries(done); 

그리고 그 done :

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

을 그래서 data.js.에서 호출이 익명 함수 (function(results) {...}) 인 그러나이 함수에는 하나의 매개 변수 만 있으므로 data.js가 보내는 두 번째 인수는 아무 것도하지 않습니다. resultlarray3[0]의 값을 가져 오지만 larray3[1]은 어디에서도 캡처되지 않습니다.

다른 방법으로 문제를 해결할 수 있습니다. 개인적으로 두 배열을 사용한 디자인은 처음부터 잘못되었다고 생각합니다. 나는 쌍으로있는 데이터 (이름과 코드)를 두 개의 다른 배열로 분리하지 않을 것이다. 대신

객체의 배열을 만들고, 주변이 하나의 배열을 전달합니다 data.js에서

: view.js에서

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

:

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

사이드 참고 : 일반 텍스트를 지정할 때 이 .innerHTML보다 선호됩니다.

+0

감사합니다. 나는 키값 쌍과 비슷한 것을 시도했지만, 나는 옳은 것을 구현하지 않았다는 것을 안다. 이것은 훌륭하게 작동했습니다. .textcontent도 고려할 것입니다. 당신은 도움이되어 주셔서 대단히 감사합니다 !! – Steve