尝试过滤和组合JSON项

Trying to filter and combine JSON items

本文关键字:JSON 组合 过滤      更新时间:2023-09-26

我有一个JSON与以下格式的几个对象:

[{
  "id":14,
  "friendlyName":"NameOfPlace 1",
  "lat":30.402735,
  "lon":-90,
  "address":"1 place street",
  "city":"NYC",
  "state":"NY",
  "zipCode":"12346",
  "locationCode":"MQ00003",
  "details":"in the bank"
},
{
  "id":15,
  "friendlyName":"NameOfPlace 2",
  "lat":30.402735,
  "lon":-90,
  "address":"1 place street",
  "city":"NYC",
  "state":"NY",
  "zipCode":"12346",
  "locationCode":"MQ00003",
  "details":"near ATM"
}]

它们是商店的位置。我有几个这样的清单。如果同一建筑中有两个位置,其中一些会有名称1和名称2。我试图找到一种方法,将它们组合成一个对象与两个值,但只有一个地方("名称"在本例的情况下)。我有两个问题,如果我有上面的对象列表,我可以根据friendlyName的字母顺序排序,然后检查是否有类似的命名位置可以组合成一个对象。注意,位置将具有相同的长度和地址,只是细节和id不同。我只能弄清楚如何线性地做到这一点,对于我正在尝试做的移动应用程序来说,这是非常缓慢的。

您可以使用散列表对友好名称进行分组,并使用数据生成一个新数组。如果数据不同,则所有值都包含在一个数组中。

var data = [{ "id": 14, "friendlyName": "NameOfPlace 1", "lat": 30.402735, "lon": -90, "address": "1 place street", "city": "NYC", "state": "NY", "zipCode": "12346", "locationCode": "MQ00003", "details": "in the bank" }, { "id": 15, "friendlyName": "NameOfPlace 2", "lat": 30.402735, "lon": -90, "address": "1 place street", "city": "NYC", "state": "NY", "zipCode": "12346", "locationCode": "MQ00003", "details": "near ATM" }],
    grouped = [];
data.forEach(function (o) {
    var key = o.friendlyName.split(/(?= 'd*$)/)[0];
    if (!this[key]) {
        this[key] = { Name: key };
        grouped.push(this[key]);
    }
    Object.keys(o).forEach(function (k) {
        if (!(k in this[key])) {
            this[key][k] = o[k];
            return;
        }
        if (this[key][k] === o[k]) {
            return true;
        }
        if (Array.isArray(this[key][k])) {
            this[key][k].push(o[k]);
            return;
        }
        this[key][k] = [this[key][k], o[k]];
    }, this);
}, Object.create(null));
console.log(grouped);

我可以根据friendlyName的字母顺序排序吗

可以使用sort方法

var sortedArray = json.sort(function(a,b){
  return a.friendlyName>b.friendlyName?1:-1
})

JSFIDDLE