2015-08-02 5 views
4

У меня есть два многомерный массив, и я хочу, чтобы создать третий многомерный массив:Match два многомерный массив в JavaScript,

var reports = [ 
    [48.98,153.48], 
    [12.3,-61.64] 
    ]; 

var vulc = [ 
    ["ciccio",48.98,153.48], 
    ["cicci",12.3,-61.64], 
    ["intruso",59.9,99.9] 
    ]; 

И я хочу, чтобы создать новый многомерный массив

var nuovarray= []; 


for (i=0; i<= reports.length; i++) { 

    var attivi= reports[i]; 
    var attlat= attivi[0]; 
    var attlng= attivi[1]; 

    for (s=0; s<=vulc.length; s++){ 
    var vulca= vulc[s]; 
    var vulcanam= vulca[0]; 
    var vulcalat= vulca[1]; 
    var vulcalng= vulca[2]; 

     if ((vulcalat==attlat) && (vulcalng==attlng){ 
      var stato= "A"; 
      nuovarray.push([vulcanam,vulcalat,vulcalng,stato]);  
     } 
     else{ 
      var stato= "N"; 
      nuovaarray.push([vulcanam,vulcalat,vulcalng,stato]);  
     }  

    } 

} 

я хотел бы иметь

var nuovarray= [ 
    ["ciccio",48.98,153.48,"N"], 
    ["cicci",12.3,-61.64,"N"], 
    ["intruso",59.9,99.9,"A"] 
    ]; 

Но я не знаю, если этот код хорошо:/

+0

Если ваш код работает, и вы только хотите знать, если/как это хорошо, тогда ваш вопрос по теме [CR] (http://codereview.stackexchange.com/). Здесь это вне темы/ – hindmost

+0

в цикле for, используйте

+0

@JaromandaX да ** ** = была глупой ошибкой, но почему я должен обменивать петли? –

ответ

1

Как я сказал в комментарии, в цикле for, используйте < не < = (массив длины N имеет индексы 0 ... N-1) ... и заменяет внешний цикл внутренним циклом и только подтолкнет со значением «N» до конца внешнего цикла, если внутренняя петля не нажата со значением «а»

var reports = [ 
 
    [48.98,153.48], 
 
    [12.3,-61.64] 
 
]; 
 

 
var vulc = [ 
 
    ["ciccio",48.98,153.48], 
 
    ["cicci",12.3,-61.64], 
 
    ["intruso",59.9,99.9] 
 
]; 
 

 
var nuovarray= []; 
 

 
for(var s = 0; s < vulc.length; s++) { 
 
    var vulca = vulc[s]; 
 
    var stato= "A"; // default, no match 
 
    var vulcanam= vulca[0]; 
 
    var vulcalat= vulca[1]; 
 
    var vulcalng= vulca[2]; 
 

 
    for(var i = 0; i < reports.length; i++) { 
 
     var attivi = reports[i]; 
 
     var attlat= attivi[0]; 
 
     var attlng= attivi[1]; 
 
    
 
     if ((vulcalat==attlat) && (vulcalng==attlng)) { 
 
      stato = "N"; 
 
      break; // we've found a match, so set stato = N and stop looping 
 
     } 
 
    } 
 
    nuovarray.push([vulcanam,vulcalat,vulcalng,stato]);  
 
} 
 

 

 
document.getElementById('result').innerHTML = (nuovarray).toSource();
<div id='result'></div>

+0

проблема в том, что я хотел бы использовать пример для цикла, а не методов, которые я не знаю:/thanks –

+0

Я уверен, что ваш код хорош и работает, но я этого не понимаю: (( –

+0

достаточно справедливо - позвольте мне переписать его –

0

Я считаю, что код не будет работать так, как он написан. По крайней мере, это не даст вам ожидаемого результата. Вы выполняете итерацию через массив vulc внутри цикла, который выполняет итерацию через отчеты. И вы подталкиваете к nuovarray внутри внутреннего цикла. Поэтому я ожидал бы 6 элементов в nuovarray, а не 3 элемента, которые вы ожидаете. Вы попробовали запустить его? Это самый простой способ доказать неверность.

+0

Это должен быть комментарий, а не ответ – hindmost

+0

да и не работает ... для меня сложно совместить два многомерных массива, поэтому я надеюсь помочь :( –

+0

Я что ваш код хорош и работает, но я этого не понимаю: (( –

0
var reports = [ 
    [48.98,153.48], 
    [12.3,-61.64] 
]; 

var vulc = [ 
    ["ciccio",48.98,153.48], 
    ["cicci",12.3,-61.64], 
    ["intruso",59.9,99.9] 
]; 

var nuovarray = []; 

vulc.forEach(function(item, indx){ 

    var bN = 'undefined' !== typeof reports[indx]; 
    bN = bN && item[1] == reports[indx][0] && item[2] == reports[indx][1]; 

    item.push(bN ? 'N' : 'A'); 

    nuovarray.push(item); 

}); 

console.log(nuovarray); 
+0

Почему '.map', а не' .forEach' - на самом деле вы ничего не напортаете? –

+0

'.map' возвращает копию массива. '.forEach' не – w35l3y

+0

Правильно, это должно быть .forEach – Alexander

0

метод map() создает новый массив с результатами вызова предоставляемой функции для каждого элемента в этом массиве.
Array.prototype.map()

Метод push() добавляет один или несколько элементов в конец массива и возвращает новую длину массива.
Array.prototype.push()

Метод some() проверяет, прошел ли какой-либо элемент в массиве тест, реализованный предоставленной функцией.
Array.prototype.some()

var reports = [ 
 
    [48.98,153.48], 
 
    [12.3,-61.64] 
 
]; 
 

 
var vulc = [ 
 
    ["ciccio",48.98,153.48], 
 
    ["cicci",12.3,-61.64], 
 
    ["intruso",59.9,99.9] 
 
]; 
 

 
console.log(vulc.map(function (item, index) { 
 
    item.push(reports.some(function (report) { 
 
    return report[0] == item[1] && report[1] == item[2]; 
 
    })?"N":"A"); 
 

 
    return item; 
 
}));

0

код отображает заданную vulc к nuovarray и добавить разыскиваемого флаг к нему. Флаг выбирается поиском по reports, и если найден, применяется 'N', в противном случае применяется 'A'.

var reports = [ 
 
     [48.98, 153.48], 
 
     [12.3, -61.64] 
 
    ], 
 
    vulc = [ 
 
     ["ciccio", 48.98, 153.48], 
 
     ["cicci", 12.3, -61.64], 
 
     ["intruso", 59.9, 99.9] 
 
    ], 
 
    nuovarray = vulc.map(function (a) { 
 
     a.push(reports.some(function (b) { 
 
      return a[1] === b[0] && a[2] === b[1]; 
 
     }) ? 'N' : 'A') 
 
     return a; 
 
    }); 
 
document.getElementById('out').innerHTML = JSON.stringify(nuovarray, null, 4);
<pre id="out"></pre>

0

Если производительность имеет значение, вы должны использовать что-то лучше, чем O (N^2):

var existingPoints = {}; 
reports.forEach(function (row) { 
    existingPoints[row.join()] = true; 
}); 

var nuovarray = vulc.map(function (row) { 
    var point = row.slice(1, 3).join(); 
    var flag = existingPoints[point] ? 'A' : 'N'; 
    return row.concat([flag]); 
});