Как считать данные, которые похожи в объектном файле JSON - PullRequest
0 голосов
/ 04 марта 2019

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

У меня есть объект JSON, который имеет много имен и фамилий,Я хочу иметь возможность идентифицировать дубликаты данных, но также, если имена похожи, он должен идентифицировать данные как одинаковые.Например:

 [
   {FirstName: 'Joshua', LastName: 'smith'}
   {FirstName: 'Joshuaa', LastName: 'smith'}
 ]

Как вы видите выше, у второго объекта есть дополнительный «а», но я хочу, чтобы это считалось тем же фрагментом данных, что и первый объект.Так что в основном принимайте во внимание опечатки в данных для FirstName и LastName.

Я думал об использовании Regex, но не могу понять, где его использовать.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Если мы говорим о дублировании, давайте уточним, что такое двуличность.Я мог бы выяснить ситуацию, когда у человека есть настоящее имя - «Иисус Навин».С точки зрения вашего вопроса, это может быть какой-то байесовский фильтр .

Что касается меня, просто конвертируйте ваш массив в объект с ключом в качестве фамилии (это дешево) и обратно в массив.

const array = [
    { FirstName: 'Joshua', LastName: 'smith' },
    { FirstName: 'Joshuaa', LastName: 'smith' }
];

const test = array.reduce((acc, el) => ({
    ...acc,
  [el.LastName]: {...el}
}), {});
const output = Object.values(test);
0 голосов
/ 04 марта 2019

Вы можете сделать это, установив значение THRESHOLD, которое вы хотите для подобия, я установил 1 в этом примере:

const array = [
    { FirstName: 'Joshua', LastName: 'smith' },
    { FirstName: 'Joshuaa', LastName: 'smith' }
];

const THRESHOLD = 1;

const compareCollections = (document) => {
    array.forEach(element => {
        let consideredSimilar = false;

        if (element.FirstName === document.FirstName) {
            // typo should be in the lastname
            if (_checkDifferences(element.LastName, document.LastName) <= THRESHOLD) {
                // they can be similar
                console.log('SIMILAR LASTNAME');
                consideredSimilar = true;
            }
        } else if (element.LastName === document.LastName) {
            // typo should be in firstname
            if (_checkDifferences(element.FirstName, document.FirstName) <= THRESHOLD) {
                // they can be similar
                console.log('SIMILAR FIRSTNAME');
                consideredSimilar = true;
            }
        }

        console.log('CONSIDERED SIMILAR: ', consideredSimilar);

    });
}

const _checkDifferences= (first, second) => {
    const splittedFirst = first.split('');
    const splittedSecond = second.split('');

    const length = splittedFirst.length > splittedSecond.length ? splittedFirst.length : splittedSecond.length;

    let differences = 0;

    for (let index = 0; index < length; index++) {
        const elementFirst = splittedFirst[index];
        const elementSecond = splittedSecond[index];

        if (elementFirst != elementSecond) {
            differences++;
        }
    }

    return differences;
}

compareCollections(array[1]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...