【问题标题】:Match two multidimensional array in Javascript在Javascript中匹配两个多维数组
【发布时间】:2015-08-02 10:07:15
【问题描述】:

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

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

但我不知道这段代码好不好:/

【问题讨论】:

  • 如果您的代码有效并且您只想知道它是否/如何良好,那么您的问题与CR 相关。这里是题外话/
  • 在 for 循环中,使用
  • @JaromandaX 是的 这是一个愚蠢的错误,但为什么我必须交换循环?
  • 交换循环是有意义的...根据您的示例输出,您希望每个 vulc 一个输出,而不是每个 reports 一个输出 - 所以,您处理每个 vulc 以查看如果 report 匹配,则相反
  • 我认为您需要一种不同的方法,您真的需要 3 维数组还是只需要将状态保持在 2 维数组中?

标签: javascript arrays multidimensional-array


【解决方案1】:

正如我在评论中所说,在 for 循环中,使用

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();
&lt;div id='result'&gt;&lt;/div&gt;

【讨论】:

  • 问题是我想要一个使用for循环而不是我不知道的方法的例子:/谢谢
  • 我确信你的代码很好并且可以工作,但我不明白:((
  • 很公平 - 让我重写它
  • 你太善良和耐心了! :)
  • 效果很好!是几个月我没有用Javascript编程,我忘记了“break”的使用!非常感谢!!!
【解决方案2】:

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

【讨论】:

  • 这应该是评论,而不是回答
  • 是的并且不起作用...对我来说很难匹配两个多维数组,所以我希望得到帮助:(
  • 我确信你的代码很好并且可以工作,但我不明白:((
【解决方案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);

【讨论】:

  • 为什么是 .map 而不是 .forEach - 你实际上没有“映射”任何东西?
  • .map 返回数组的副本。 .forEach 没有
【解决方案4】:

代码将给定的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);
&lt;pre id="out"&gt;&lt;/pre&gt;

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-04
        • 2017-10-11
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多