在多个数组(超过 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));
我有 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));