我有一个这样的字典列表,其中可能包含基于一些字典属性(并非所有属性)的重复项:
const data = [{
name: 'v',
latitude: '30.0',
longitude: '25.0'
}, {
name: 'w',
latitude: '30.0',
longitude: '25.0'
}, {
name: 'x',
latitude: '45.9',
longitude: '50.2'
}, {
name: 'y',
latitude: '40.5',
longitude: '85.7'
}, {
name: 'z',
latitude: '40.5',
longitude: '85.7'
}];
这里,如果两个字典具有相同的经度和纬度,则它们被视为重复。
目标是减少这个一维列表,将一种类型的所有重复项分组到一个嵌套列表中。例如,如果我们有三个具有相同坐标的重复项,它们应该进入自己的嵌套列表,而另一个坐标的两个重复项则进入不同的嵌套列表。即使是没有重复项的独立坐标也应该进入其自己的嵌套列表。我们希望最终得到一个列表,其中每个项目都是代表唯一坐标的列表。
期望的输出:
[
[
{
name: 'v',
latitude: '30.0',
longitude: '25.0'
}, {
name: 'w',
latitude: '30.0',
longitude: '25.0'
}
],
[
{
name: 'x',
latitude: '45.9',
longitude: '50.2'
}
],
[
{
name: 'y',
latitude: '40.5',
longitude: '85.7'
}, {
name: 'z',
latitude: '40.5',
longitude: '85.7'
}
]
];
编辑:更正了所需的输出,以便所有项目都是列表。
最佳答案
我首先将每个数据点放入一个对象中。我将使用坐标 (lat,lng) 作为键,它指向每个唯一坐标的数组。当您迭代数据点时,您可以将每个数据点添加到对象中各自的数组中。
然后迭代您刚刚创建的该对象的值。每个值都应该是一个数组。如果该数组的长度为 1,则可以仅将该对象添加到输出数组中,但如果它大于 1,则可以将整个数组添加到输出数组中。
瞧。
const data = [{
name: 'v',
latitude: '30.0',
longitude: '25.0'
}, {
name: 'w',
latitude: '30.0',
longitude: '25.0'
}, {
name: 'x',
latitude: '45.9',
longitude: '50.2'
}, {
name: 'y',
latitude: '40.5',
longitude: '85.7'
}, {
name: 'z',
latitude: '40.5',
longitude: '85.7'
}];
let obj = {};
data.forEach(e => {
let key = `${e.latitude},${e.longitude}`;
if(obj[key] == undefined)
obj[key] = [];
obj[key].push(e);
});
let output = [];
Object.values(obj).forEach(e => {
if(e.length == 1)
output.push(e[0]);
else
output.push(e);
});
console.log(output);
关于javascript - 根据重复的字典属性将一维列表减少为锯齿状二维列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69170419/