在Javascript中匹配两个多维数组

时间:2015-08-02 10:07:15

标签: javascript arrays multidimensional-array

我有两个多维数组,我想创建第三个多维数组:

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"]
    ];

但我不知道这段代码是否合适:/

6 个答案:

答案 0 :(得分:1)

正如我在评论中所说,在for循环中,使用&lt; not&lt; =(长度为N的数组有索引0 ... N-1)...并将外循环与内循环交换,并且只在内循环结束前按值'N'推送循环没有推送值'A'

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>

答案 1 :(得分:0)

我相信代码不会按照它的编写方式工作。至少,它不会给你预期的输出。您正在遍历循环内的vulc数组,迭代报告。而你正在推动内循环内的nuovarray。所以我期待nuovarray中的6个元素,而不是你期望的3个元素。 你试过试试吗?这是证明不正确的最简单方法。

答案 2 :(得分: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);

答案 3 :(得分: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;
}));

答案 4 :(得分: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>

答案 5 :(得分: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]);
});