在多个数组(超过 2 个)中查找对象匹配项

Finding object matches in multiple arrays (more than 2)

我有 3 个来源,我正在将数据提取到其中,并且只想拥有一个具有匹配对象(坐标)的项目的新集合。我尝试了几种方法,包括链接下划线方法,但似乎无法以可靠的方式提取超过 2 个。如果我使用嵌套循环,如果父循环没有匹配项,但子循环有匹配项,那么它们很快就会变得混乱(如果这有意义的话)。

我也试过将它们连接成一个大数组,如果这是最简单的方法就没问题,但无法弄清楚如何找到坐标对象匹配项。

每个数组应该超过 20 个结果,所以性能对我来说应该不是真正的问题。任何帮助将不胜感激......我已经花了很多时间在不同的解决方案上,我正准备扔掉我的笔记本电脑。

var arrays = [
  [{
    id: "NMm421ue-NSXOu7Af2CNmg",
    name: "name1",
    source: 'mapQuest',
    coords: {
      lat: 35.878,
      lng: -78.85
    }
  }, {
    id: "3233e-NSXOu7A3436gdfg",
    name: "another name",
    source: 'mapQuest',
    coords: {
      lat: 40.558,
      lng: -84.78
    }
  }],
  [{
    id: "1234567768",
    name: 'googleName',
    source: 'google',
    coords: {
      lat: 35.878,
      lng: -78.85
    }
  }, {
    id: "555446888",
    name: 'Another Google',
    source: 'google',
    coords: {
      lat: 44.866,
      lng: -65.84
    }
  }],
  [{
    id: "54sfs2198",
    name: 'Personal 1',
    source: 'personal',
    coords: {
      lat: 44.866,
      lng: -65.84
    }
  }, {
    id: "98456245f",
    name: '2nd personal',
    source: 'personal',
    coords: {
      lat: 35.878,
      lng: -78.85
    }
  }]
];


var result = arrays.shift().filter(function(v) {
  console.log('v:', v);
  return arrays.every(function(a) {
    return a.indexOf(v) !== -1;
  });
});

预期结果为

[
  {id: "98456245f", name:'2nd personal', source: 'personal', coords: {lat: 35.878, lng: -78.85}},
  {id: "1234567768", name:'googleName', source: 'google', coords: {lat: 35.878, lng: -78.85}},
  {id: "NMm421ue-NSXOu7Af2CNmg", name: "name1", source:'mapQuest', coords: {lat: 35.878, lng: -78.85}}
]

如果您不关心重复项来自所有数组的何处,您可以将集合和分组展平为 lat/lng 对。然后,过滤掉任何不够大以传递大小截止参数 threshold.

的分组

请注意,结果以数组数组的形式返回,这对我来说最有意义,因为可能有多个分组。如有必要,调用者可以将其展平。

const findCoordDupes = (coords, threshold=2) => {
  return Object.values(coords.flat().reduce((a, e) => {
    const key = `${e.coords.lat} ${e.coords.lng}`;
    
    if (!a[key]) a[key] = [];
    
    a[key].push(e);
    return a;
  }, {})).filter(e => e.length > threshold);
};

const coords = [
  [{
    id: "NMm421ue-NSXOu7Af2CNmg",
    name: "name1",
    source: 'mapQuest',
    coords: {
      lat: 35.878,
      lng: -78.85
    }
  }, {
    id: "3233e-NSXOu7A3436gdfg",
    name: "another name",
    source: 'mapQuest',
    coords: {
      lat: 40.558,
      lng: -84.78
    }
  }],
  [{
    id: "1234567768",
    name: 'googleName',
    source: 'google',
    coords: {
      lat: 35.878,
      lng: -78.85
    }
  }, {
    id: "555446888",
    name: 'Another Google',
    source: 'google',
    coords: {
      lat: 44.866,
      lng: -65.84
    }
  }],
  [{
    id: "54sfs2198",
    name: 'Personal 1',
    source: 'personal',
    coords: {
      lat: 44.866,
      lng: -65.84
    }
  }, {
    id: "98456245f",
    name: '2nd personal',
    source: 'personal',
    coords: {
      lat: 35.878,
      lng: -78.85
    }
  }]
];

console.log(findCoordDupes(coords));