2015-06-22 4 views
0

У меня есть объект JSON:Проверка дубликатов в формате JSON

var object1 = [{ 
     "value1": "1", 
     "value2": "2", 
     "value3": "3", 
    }, 
    { 
     "value1": "1", 
     "value2": "5", 
     "value3": "7", 
    }, 
    { 
     "value1": "6", 
     "value2": "9", 
     "value3": "5", 
    }, 
    { 
     "value1": "6", 
     "value2": "9", 
     "value3": "5", 
    }] 

Теперь я хочу взять каждую запись из этого объекта и проверить, сколько раз точная копия этой записи появляется в этом объекте. Если это всего лишь 1 экземпляр, сделайте что-нибудь, и если он больше 2, сделайте что-нибудь еще.

Существует несколько ответов на дубликаты JSON, но они нацелены на определенное значение не полной записи.

Так я возьму запись:

{ 
     "value1": "1", 
     "value2": "2", 
     "value3": "3", 
    } 

и сравнить его с объектом. Вышеприведенная запись вернет 1, поскольку внутри объекта всего 1 экземпляр

Для будущего использования. Полный ответ был бы:

var asset = [ 
    { value1: "1", value2: "2", value3: "3" }, 
    { value1: "1", value2: "5", value3: "7" }, 
    { value1: "6", value2: "9", value3: "5" }, 
    { value1: "6", value2: "9", value3: "5" } 
]; 

function countEqual(oo, pp) { 
    var count = 0; 
    oo.forEach(function (el) { 
     var i, equal = true; 
     for (i in el) { 
      equal = equal && el[i] === pp[i]; 
     } 
     equal && count++; 
    }); 
    return count; 
} 

     var cleaned = []; 

     asset.forEach(function (itm) { 
      var unique = true; 
      cleaned.forEach(function (itm2) { 
       if (_.isEqual(itm, itm2)) unique = false; 
      }); 
      if (unique) cleaned.push(itm); 
     }); 

     for (var i = 0; i < cleaned.length; i++) 
     { 
      if(countEqual(asset, cleaned[i]) === 1) 
       { 
        // DO SOMETHING 
       } 
      else 
       { 
        // DO SOMETHING ELSE 
       } 
     } 
+0

что ты жулик sider как 'duplicate'? –

+4

1) Это не JSON. 2) у вас не может быть дубликатов ключей в объектах JavaScript. Конечным результатом вашего назначения является то, что каждый объект в 'object1' будет иметь один ключ' value2'. –

+0

Простите, я написал плохой пример, я удалил ключи – Danielok1993

ответ

1
var asset = [ 
    { value1: "1", value2: "2", value3: "3" }, 
    { value1: "1", value2: "5", value3: "7" }, 
    { value1: "6", value2: "9", value3: "5" }, 
    { value1: "6", value2: "9", value3: "5" } 
]; 

function countEqual(oo, pp) { 
    var count = 0; 
    oo.forEach(function (el) { 
     var i, equal = true; 
     for (i in el) { 
      equal = equal && el[i] === pp[i]; 
     } 
     equal && count++; 
    }); 
    return count; 
} 
console.log(countEqual(asset, { value1: "1", value2: "1", value3: "2" })); // 0 
console.log(countEqual(asset, { value1: "1", value2: "2", value3: "3" })); // 1 
console.log(countEqual(asset, { value1: "6", value2: "9", value3: "5" })); // 2 
+0

Да, это сработало нормально. Со своей стороны мне пришлось очистить объект «актив», чтобы содержать только уникальные значения. Затем используйте цикл для нового уникального массива и примените его к вашему коду. Спасибо! – Danielok1993

+0

добро пожаловать! –

1

Если то, что вы ищете функцию, которая подсчитывает количество вхождений объекта в массиве, следующий код должен помочь вам (это предполагает, что свойства в вашем объекты всегда будут следовать в том же порядке Если вы не уверены в том, что вы должны использовать правильную функцию проверки равенства):.

var nbOcc = function (needle, haystack) { 
    return haystack.filter(function (record) { 
    return JSON.stringify(needle) === JSON.stringify(record); 
    }).length; 
}; 

console.log(nbOcc({ 
    "value1": "1", 
    "value2": "2", 
    "value3": "3", 
}, object1)); // 1 

console.log(nbOcc({ 
    "value1": "6", 
    "value2": "9", 
    "value3": "5", 
}, object1)); // 2 

JSFiddle link