Удаление дубликатов из объекта json

0

Я зацикливаюсь на json-подобном объекте, и я пытаюсь исключить дублируемую запись (с идентификатором: 1) без успеха. Вот мой код:

var productData = '[{"id":1,"name":"Retro","price":10,"color":"blue"},{"id":2,"name":"Designer","price":12,"color":"red"},{"id":3,"name":"Classic","price":14,"color":"yellow"},{"id":1,"name":"Retro","price":10,"color":"blue"},{"id":4,"name":"Rimless","price":14,"color":"purple"},{"id":5,"name":"Glam & Sparkle","price":8,"color":"grey"}]',
    data = $.parseJSON(productData),
    table = $("#productTable"),
    dataFiltered = [];

$.each(data, function(key, value) {

    if ($.inArray(value.id, dataFiltered) === -1) {

        dataFiltered.push({"id": value.id, "price": value.price, "name": value.name,"color": value.color});


    }
});

console.log(dataFiltered)

$.each(dataFiltered, function(key, value) {
        table.append("<div class='row'><span>&pound;"+value.price+"</span>"+
                     "<span>"+value.name+"</span>"+"<span>"+value.color+
                     "</span></div>");
});

Что я делаю не так? Он возвращает тот же объект с дублирующейся записью. здесь скрипка демо тоже.

Заранее спасибо.

Теги:
arrays

2 ответа

3
Лучший ответ

Попробуйте этот JSFIDDLE

Не уверен, что это оптимальный способ или нет. :)

var ids = []; 
$.each(data, function(key, value) {
    if($.inArray(value.id, ids) === -1){
        ids.push(value.id);
        dataFiltered.push({"id": value.id, "price": value.price, "name": value.name,"color": value.color});
    }
});
  • 0
    Не знаю, если оптимально, но это работает как ветер! Спасибо :)
  • 0
    @SergiuParaschiv Я сделал .. пожалуйста, проверьте скрипку для полного кода ..
0

Ваша проблема здесь: $.inArray(value.id, dataFiltered). value.id - целое число. dataFiltered - это массив объектов. $.inArray делает это

for(i = 0; i < dataFiltered.length; i++) { 
    if(value.id === dataFiltered[i]) return 'found'; 
}

поэтому он сравнивает целое число с некоторыми объектами. Очевидно, ничего не найдет.

Что вам нужно сделать, это реализовать функцию find:

function arrayFind(a, v, check) {
    var i;
    for(i = 0; i < a.length; i++) {
        if(check.call(this, a[i], v)) {
            return true; 
        }    
    }
    return false;
}

и используйте его так:

var findById = function(item, value) {
    return item.id === value;
};

if (arrayFind(dataFiltered, value.id, findById) === false) {
    .... 
}

Попробуйте взглянуть на lodash для более удобной реализации.

Кроме того, чтобы лучше понять разницу, используя мою реализацию arrayFind, ваш код будет выглядеть так:

var findById = function(item, value) {
    return item === value; // your issue is here
};

if (arrayFind(dataFiltered, value.id, findById) === false) {
    ....
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню