Я зацикливаюсь на 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>£"+value.price+"</span>"+
"<span>"+value.name+"</span>"+"<span>"+value.color+
"</span></div>");
});
Что я делаю не так? Он возвращает тот же объект с дублирующейся записью. здесь скрипка демо тоже.
Заранее спасибо.
Попробуйте этот 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});
}
});
Ваша проблема здесь: $.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) {
....
}