Javascript сравнить два JSON массива и вернуть ключ несоответствующего значения - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть два JSON массива, хотелось бы знать ключ, который не совпадает. Мне не нужно значение.

Пример:

livetable: [
  { id: 1, name: "Sandra" },
  { id: 2, name: "John" },
],
backupTable: [
  { id: 1, name: "Sandra" },
  { id: 2, name: "Peter" },
],

Я могу получить пару ключ / значение, которая отличается от этого сценария Loda sh:

difference = _.differenceWith(livetable,backupTable,_.isEqual)

Но мне просто нужен ключ, в этом примере «name» для «id: 2» не совпадает, поэтому мне нужно получить ключ «name» для нового массива / переменной.

(Использование VUE CLI)

EDIT: добавлен пример вывода текущего кода.

var livetable = [{"id": 1, "name": "Sandra", "id": 2, "name": "John"}]
var backupTable = [{"id": 1, "name": "Sandra", "id": 2, "name": "Peter"}]

console.log(_.differenceWith(backupTable,livetable,_.isEqual))
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.15/lodash.min.js"></script>

Это выведет пару ключ: значение, но мне просто понадобится ключ, который отличается.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Здесь работает VUE код для моей проблемы. Функция возвращает [ "name" ], что именно то, что мне нужно.

data() {
    return {
      livetable: [{ id: 1, name: "Sandra" },{ id: 2, name: "John" }],
      backupTable: [{ id: 1, name: "Sandra" },{ id: 2, name: "Peter" }],
      difColumns: null,
    };
  },
methods: {
    test3() {
      let resultArray = []
      this.livetable.forEach((array1, index) => {
        const array2 = this.backupTable[index];
        resultArray.push(this._.reduce(array1, (result, value, key) => this._.isEqual(value, array2[key]) ? result : result.concat(key), []))
      });
      this.difColumns = resultArray[0]
    }
},
0 голосов
/ 15 апреля 2020

Мне кажется, я понимаю, что ты пытаешься сделать. Однако есть некоторые неизвестные, например, что должно произойти, если во втором наборе данных есть отсутствующая запись?

В этом решении предполагается, что каждая таблица данных имеет одинаковое количество записей, а записи имеют одинаковые идентификаторы.

// define data
const livetable = [
  { id: 1, name: "Sandra" },
  { id: 2, name: "John" }
]
const backupTable = [
  { id: 1, name: "Sandra" },
  { id: 2, name: "Peter" }
]


const getDifferentRecordsByID = (sourceRecords, compareRecords) => {
  // simple utility function to return a record object matching by ID
  const findComparisionRecord = id => compareRecords.find(compareRecord => compareRecord.id === id)
  // using the utility function, we can filter out any mismatching records by comparing name
  return sourceRecords
    .filter(sourceRecord => sourceRecord.name !== findComparisionRecord(sourceRecord.id).name)
    // then map over all the records and just pull out the ID
    .map(record => record.id)
}

console.log(getDifferentRecordsByID(livetable, backupTable)) // [2]
...