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

但是我不知道这个代码是否好:/

正如我在评论中所说,在for循环中,使用<=(长度为N的数组索引为0…n - 1)……并将外部循环与内部循环交换,并且只有在内部循环未推送值为'A'的情况下,在外部循环结束前才推送值为'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>

我相信代码不会像它写的那样工作。至少,它不会给您期望的输出。您正在遍历循环中的vulc数组,该循环遍历报告。你正在向内循环内的新数组推进。所以我希望nuovarray中有6个元素,而不是你期望的3个元素。你试着运行了吗?这是证明错误最简单的方法。

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);

代码将给定的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>

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;
}));

如果性能很重要,您应该使用比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]);
});

相关内容

  • 没有找到相关文章

最新更新