Получить дублированные значения из массива, проверив с двумя элементами - PullRequest
0 голосов
/ 16 мая 2018

Если у моего массива есть эти данные ниже

let array = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
        { name: "Suresh", SalseVersion: 12, MarketingCode: 13 },
        { name: "Siva", SalseVersion: 10, MarketingCode: 14 },
        { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 },...]

Тогда я ожидаю этого результата ниже

[{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
 { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 }]

Если у моего массива есть эти данные ниже

let array = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
        { name: "Suresh", SalseVersion: 12, MarketingCode: 14},
        { name: "Siva", SalseVersion: 12, MarketingCode: 14 },
        { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 },...]

Тогда я ожидаю получить следующий результат.

        [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
        { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 }
        { name: "Suresh", SalseVersion: 12, MarketingCode: 14},
        { name: "Siva", SalseVersion: 12, MarketingCode: 14 }]

Я пробовал этот способ: Получить все неуникальные значения (т. Е. Дублировать / более одного вхождения) в массиве

let arr = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
        { name: "Suresh", SalseVersion: 12, MarketingCode: 13 },
        { name: "Siva", SalseVersion: 10, MarketingCode: 14 },
        { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 }]


var sorted_arr = arr.slice().sort();
var results = [];
for (var i = 0; i < sorted_arr.length - 1; i++) {
    if (sorted_arr[i + 1].SalesVersion == sorted_arr[i].SalesVersion && sorted_arr[i + 1].MarketingCode == sorted_arr[i].MarketingCode) {
        results.push(sorted_arr[i]);
    }
}

console.log(results);

Но не удалось получить дублированные значения.Не могли бы вы решить это?

Примечание: Обратите внимание, что оно должно работать, если значение SalseVersion и MarketingCode равно string/number/Boolean.

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

enter image description here

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

По сути, cou может продолжать сортировку, но с требуемым ключом это возвращает вид сгруппированного массива, в котором все нужные ключи и их значения находятся в непосредственной близости.

Затем вы можете отфильтровать массив, проверив все ключи с помощью фактического значения и предшественника или преемника.

var array = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 }, { name: "Suresh", SalseVersion: 12, MarketingCode: 13 }, { name: "Siva", SalseVersion: 10, MarketingCode: 14 }, { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 }],
    keys = ['SalseVersion', 'MarketingCode'],
    result = array
        .sort((a, b) => {
            var d;
            keys.some(k => d = a[k] - b[k]);
            return d;
        })
        .filter((o, i, a) => 
            keys.every(k => a[i - 1] && a[i - 1][k] === o[k]) ||
            keys.every(k => a[i + 1] && o[k] === a[i + 1][k])
        );

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Подход с использованием одного цикла для несортированных данных с использованием хеш-таблицы для временного сбора первого объекта группы или просто для указания дубликатов группы.

var array = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 }, { name: "Suresh", SalseVersion: 12, MarketingCode: 13 }, { name: "Siva", SalseVersion: 10, MarketingCode: 14 }, { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 }],
    keys = ['SalseVersion', 'MarketingCode'],
    result = array.reduce((hash => (r, o) => {
        var key = keys.map(k => o[k]).join('|');
        if (key in hash) {
            if (hash[key]) {
                r.push(hash[key]);
                hash[key] = false;
            }
            r.push(o);
        } else {
             hash[key] = o;
        }
        return r;
    })(Object.create(null)), []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 16 мая 2018

Похоже, вы пытаетесь найти элементы, для которых существует хотя бы один элемент в массиве с похожими свойствами.Вы можете использовать .filter для этого, затем sort:

const dupesFromArr = array => {
  const filteredArr = array.filter(({ name, SalseVersion, MarketingCode }, i, arr) => (
    arr.find((item, findI) => (
      findI !== i &&
      SalseVersion === item.SalseVersion &&
      MarketingCode === item.MarketingCode
    ))
  ));
  return filteredArr.sort((a, b) =>
    String(a.SalseVersion).localeCompare(String(b.SalseVersion), 'kn') ||
    String(a.MarketingCode).localeCompare(String(b.MarketingCode), 'kn')
  );
};

console.log(dupesFromArr([{name:"Ramesh",SalseVersion:10,MarketingCode:11},{name:"Suresh",SalseVersion:12,MarketingCode:13},{name:"Siva",SalseVersion:10,MarketingCode:14},{name:"Sakthi",SalseVersion:10,MarketingCode:11}]))
console.log(dupesFromArr([{name:"Ramesh",SalseVersion:10,MarketingCode:11},{name:"Suresh",SalseVersion:12,MarketingCode:14},{name:"Siva",SalseVersion:12,MarketingCode:14},{name:"Sakthi",SalseVersion:10,MarketingCode:11}]))
0 голосов
/ 16 мая 2018

Вы можете использовать reduce

Первый reduce сгруппирует значения, используя объединенные значения SalseVersion и MarketingCode.

Второй reduce проверит, имеет ли группа более 1 элемента. Если есть concat значения в 1 массив.

let array = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },{ name: "Suresh", SalseVersion: 12, MarketingCode: 14},{ name: "Siva", SalseVersion: 12, MarketingCode: 14 },{ name: "Sakthi", SalseVersion: 10, MarketingCode: 11 }];

let result = Object.values(array.reduce((c, v) => {
  let k = v.SalseVersion + '-' + v.MarketingCode;
  c[k] = c[k] || [];
  c[k].push(v);
  return c;
}, {})).reduce((c, v) => v.length > 1 ? c.concat(v) : c, []);

console.log( result );
0 голосов
/ 16 мая 2018

Вы можете обновить свой код до

let arr = [{ name: "Ramesh", SalseVersion: 10, MarketingCode: 11 },
    { name: "Suresh", SalseVersion: 12, MarketingCode: 14},
    { name: "Siva", SalseVersion: 12, MarketingCode: 14 },
    { name: "Sakthi", SalseVersion: 10, MarketingCode: 11 },
    { name: "OP", SalseVersion: 10, MarketingCode: 11 }]

// You need to write the custom sort function
var sorted_arr = arr.slice().sort((a,b) => {
     if(a.SalseVersion === b.SalseVersion) {
          return a.MarketingCode- b.MarketingCode;
      }
      return a.SalseVersion - b.SalseVersion;
});
var results = [];
for (var i = 0; i < sorted_arr.length - 1; i++) {
    if (sorted_arr[i + 1].SalesVersion == sorted_arr[i].SalesVersion && sorted_arr[i + 1].MarketingCode == sorted_arr[i].MarketingCode) {
        /* push both the elements in case of match with only exception 
         * being if it has been pushed previously where there are more than 2 matches */
       if (i >= 1 && sorted_arr[i - 1].SalesVersion == sorted_arr[i].SalesVersion && sorted_arr[i - 1].MarketingCode == sorted_arr[i].MarketingCode) {
         results.push(sorted_arr[i+1]);
       } else {
         results.push(sorted_arr[i], sorted_arr[i+1]);
       }            
    }
}

console.log(results);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...