2016-06-28 2 views
2

У меня есть JSON с несколькими объектами с этим форматом:Попытка фильтровать и комбинировать элементы 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" 
}] 

Они являются расположение магазинов. У меня есть несколько из них в списке. Некоторые из них имеют имена, такие как Name 1 и Name 2, если в одном здании есть 2 местоположения. Я пытаюсь найти способ объединить их в один объект с обоими значениями, но только одно место («Имя» в примере). У меня есть два вопроса, если у меня есть список таких объектов, как указано выше, я могу сортировать исходя из friendlyName в алфавитном порядке, а затем проверить, есть ли похожие именованные местоположения, которые могут быть объединены в один объект. Обратите внимание, что местоположения будут иметь один и тот же длинный лат и адрес, только разные детали и идентификаторы. Я могу только выяснить, как сделать это линейно, и для мобильного приложения, которое я пытаюсь сделать, очень медленно.

+0

использование 'underscore.js' вы можете делать все это. – Venky

+0

Вы определенно можете использовать underscore.js. Хотя совсем не нужно. Просто используйте метод 'sort'. –

+0

Сортировка была довольно легкой, я понял. Как насчет проверки. Места будут всегда заканчиваться числом. Мое непосредственное, хотя это проверить целое число в конце и поиск следующих нескольких в списке и посмотреть, имеют ли они одинаковое строковое значение до целого пятна, а затем берут их данные и добавляют их к первому объекту. – Peter

ответ

2

Вы можете использовать хэш-таблицу для группирования дружественное имя и создать новый массив с данными. Если данные разные, все значения находятся в массиве.

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

+0

, чтобы он работал, но как бы вы это сделали у него просто одно значение id, а не массив? Мне нужно использовать значение id для доступа к представлениям. Просто по умолчанию его меньшее значение было бы самым легким – Peter

+0

, вы можете выполнить 'Array # join (',')' на нем и получить все идентификаторы, разделенные запятой. –

1

можно сортировать на основе офф FRIENDLYNAME по алфавиту

Вы можете сделать это с помощью sort метода

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

JSFIDDLE

Смежные вопросы