Устранение дубликатов в объекте JSON - PullRequest
13 голосов
/ 29 июня 2011
[
  {
    "lastName": "Seymour",
    "gender": "Female",
    "patientID": 18134,
    "firstName": "Stephanie",
    "age": "111Y"
  },
  {
    "lastName": "Seymour",
    "gender": "Female",
    "patientID": 18134,
    "firstName": "Stephanie",
    "age": "111Y"
  }
]

Как я могу проверить свой JSON перед добавлением, содержит ли он это значение или нет ...

Ответы [ 2 ]

14 голосов
/ 29 июня 2011

Очевидный путь

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

function contains(items, obj) {
    var itemKey = null;
    var objKey = obj.firstName + ";" + obj.lastName;
    var result = false;
    for(var i = 0; !result && i < arr.length; i++)
    {
        itemKey = items[i].firstName + ";" + items[i].lastName;
        result = itemKey === objKey;
    }
    return result;
};

Всякий раз, когда вы будете искать существующий объект:

contains(arr, newObj);

Умный (эр) способ

В этом коде используется Javascript, чьи прототипы можно использовать в качестве массивов для хранения ассоциативной памяти. Предположим, у вас есть элементы JSON в переменной arr. Определите ваш ключ сравнения (скажем, его имя и фамилия):

var arr = /* your JSON object */;
var hash = (function() {
    var keys = {};
    return {
        contains: function(key) {
            return keys[key] === true;
        },
        add: function(key) {
            if (keys[key] !== true)
            {
                keys[key] = true;
            }
        }
    };
})();

var key = null;
for (var i = 0; i < arr.length; i++)
{
    key = arr[i].firstName + ";" + arr[i].lastName;
    if (!hash.contains(key))
    {
        hash.add(key);
    }
}

Узнать, есть ли у вас элемент в вашем массиве, довольно просто:

hash.contains(key);

И это все. Гораздо быстрее, чем итерация по всему массиву. Особенно, когда в нем много предметов.

0 голосов
/ 29 июня 2011

что такое "содержит это значение"? Вы имеете в виду, что два элемента имеют все поля равными?

в этом случае вы можете сериализовать в строку (json) каждый элемент и сравнить новый (также сериализованный) с набором существующих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...