Сравнение значений в массиве объектов json

1

У меня есть json array1 как:

[
 { id:0, name:"adam", uName: "aSilver", uId: "123", table: "table1"},
 { id:1, name:"john", uName: "jBerlin", uId: "456", table: "table1"}
]

У меня есть еще один json array2 как:

[
 { id:0, name:"adam", uName: "aSilver, jBerlin", uId: "123, 456", createdBy: 
"auto", createdOn: "09/10/2018", desc: "none", table: "table1"},
 { id:1, name:"john", uName: "aSilver, jBerlin", uId: "123, 456", createdBy: 
"auto", createdOn: "09/10/2018", desc: "none1", table: "table1"},
 { id:0, name:"steve" uName: "aSilver, jBerlin, pParis", uId: "123, 456, 
 789", createdBy: "auto", createdOn: "09/10/2018", desc: "none2", table: 
"table2"},
 { id:0, name:"nash", uName: "aSilver, jBerlin, pParis", uId: "123, 456, 
 789", createdBy: "auto", createdOn: "09/10/2018", desc: "none3", table: 
"table2"},
 { id:0, name:"sand", uName: "aSilver", uId: "123", createdBy: "auto", 
createdOn: "09/10/2018", desc: "none4", table: "table3"}
]

Я должен проверить, существует ли комбинация uname + uid в массиве 1 в массиве2

Итак, как показано ниже:

Сначала из массива2 нужно получить только уникальные значения. Уникальные значения основаны на "таблице". Результат ниже:

[
 { id:0, name:"adam", uName: "aSilver, jBerlin", uId: "123, 456", createdBy: 
"auto", createdOn: "09/10/2018", desc: "none", table: "table1"},
 { id:0, name:"steve" uName: "aSilver, jBerlin, pParis", uId: "123, 456, 
789", createdBy: "auto", createdOn: "09/10/2018", desc: "none2", table: 
"table2"},
 { id:0, name:"sand", uName: "aSilver", uId: "123", createdBy: "auto", 
createdOn: "09/10/2018", desc: "none4", table: "table3"}
]

Теперь я могу выполнить цикл над массивом, создавая новый json array3 как:

[
 { comparer: "aSilver_123, jBerlin_456", table: "table1" }
 { comparer: "aSilver_456, jBerlin_456, pParis_789", table: "table 2" }
 { comparer: "aSilver_123", table: "table 3" }
]

Теперь мне нужно сравнить только сравнительный ключ array1 и array3

Так как у массива 1 есть "aSilver_123, jBerlin_456", который похож на первый элемент массива3. Теперь я бы выбросил ошибку, в которой "table1" имеет повторяющиеся значения.

На данный момент я нашел ниже метод, который проверяет уникальность, но мне нужно найти уникальность в массиве объектов, чтобы это не сработало.

     Array.prototype.unique = function () {
        var r = new Array();
        o: for (var i = 0, n = this.length; i < n; i++) {
            for (var x = 0, y = r.length; x < y; x++) {
                if (r[x] == this[i]) {                       
                    return false;
                }
            }
            r[r.length] = this[i];
        }
        return true;
    }

Извините, я знаю его небольшое необычное сравнение, которое я ищу.

Хотелось узнать, какой эффективный способ приблизиться к этому?

Спасибо

Вот мой jsfiddle:

http://jsfiddle.net/50pxjkda/7

  • 1
    Ничего из этого не является JSON
Теги:
javascript-objects

1 ответ

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

Создайте объект, чьими ключами являются свойства table array2. Поскольку объектные ключи уникальны, это даст вам уникальные объекты.

obj = {};
array2.forEach(o => obj[o.table] = o);
unique_array2 = Object.keys(obj).map(k => obj[k]);

Чтобы найти элементы, общие для array1 и unique_array2 вы просто используете вложенные циклы, которые сравнивают свойства.

matches = [];
array1.forEach(o1 => unique_array2.forEach(o2 => {
    if (o1.uName == o2.uName && o1.uid == o2.uid) {
        matches.push(o1);
    }
}));
  • 0
    Приведенный выше код работает нормально и дает мне уникальные значения из Array2. Теперь, как мне пойти дальше и сравнить с моим массивом 1. В вашем коде unique_array2 возвращает мне массив как obj. Я создал jsfiddle для вас: jsfiddle.net/50pxjkda/7
  • 0
    Пожалуйста, используйте фрагмент стека вместо jsfiddle.
Показать ещё 3 комментария

Ещё вопросы

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