Отфильтровать объекты в массиве, если одно значение совпадает - PullRequest
0 голосов
/ 18 февраля 2020

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

Например, я могу получить обратно:

  [
   {
    "Name": "blah",
    "Date": "1992-02-18T00:00:00.000Z",
    "Language": "English",
  },
   {
    "Name": "blahzay",
    "Date": "1998-02-18T00:00:00.000Z",
    "Language": "French",
  },       {
    "Name": "blah",                     // same name, no problem
    "Date": "1999-02-18T00:00:00.000Z", // different date
    "Language": "English",             // but same language
  },
 ]

Итак, я хочу проверить, чтобы ни у двух объектов не было ключа с одинаковым значением «Язык» (в данном случае «Engli sh»).

Я хотел бы получить общий процесс отфильтровывания всего объекта, если его значение «Language» дублируется, с дополнительной проблемой, когда каждый раз возвращается не одинаковое количество объектов. Итак, учитывая динамическое c количество объектов в массиве.

Здесь есть пример: Неожиданный результат при фильтрации одного массива объектов по двум другим массивам объектов

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

Я бы искал способ сравнить

  arrayName[eachObject].Language === "English"

и оставьте один из объектов, но любые другие (неизвестное количество объектов) должны быть отфильтрованы, скорее всего, с использованием метода .filter () вместе с .map ().

Ответы [ 4 ]

1 голос
/ 18 февраля 2020

Использование Set позволяет легко удалять дубликаты для любого количества ключей. Я старался быть максимально многословным, чтобы каждый шаг был ясен.

var objects = [{ "Name": "blah", "Date": "1992-02-18T00:00:00.000Z", "Language": "English", }, { "Name": "blah", "Date": "1998-02-18T00:00:00.000Z", "Language": "French", }, { "Name": "blah", "Date": "1999-02-18T00:00:00.000Z", "Language": "English" }];

function uniqueKeyVals(objects, key) {
  const objVals = objects.map(object => object[key]); // ex. ["English", "French", "English"]  
  return objects.slice(0, new Set(objVals).size);     // ex. { "English", "French" }.size = 2
}

function removeKeyDuplicates(objects, keys) {
  keys.forEach(key => objects = uniqueKeyVals(objects, key));
  return objects;
}

// can also use uniqueKeyVals(key) directly for just one key
console.log("Unique 'Language': \n", removeKeyDuplicates(objects, ["Language"]));
console.log("Unique ['Language', 'Name']: \n", removeKeyDuplicates(objects, ["Language", "Name"]));
1 голос
/ 18 февраля 2020

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

const objs = [
   {
    "Name": "blah",
    "Date": "1992-02-18T00:00:00.000Z",
    "Language": "English",
  },
   {
    "Name": "blahzay",
    "Date": "1998-02-18T00:00:00.000Z",
    "Language": "French",
  },       {
    "Name": "blah",                     // same name, no problem
    "Date": "1999-02-18T00:00:00.000Z", // different date
    "Language": "English",             // but same language
  },
 ],
 presentLanguages = [];
 let languageIsNotPresent;
 const objsFilteredByLanguage = objs.filter(function (o) {
  languageIsNotPresent = presentLanguages.indexOf(o.Language) == -1;
  presentLanguages.push(o.Language);
  return languageIsNotPresent;
 });
 console.log(objsFilteredByLanguage);
1 голос
/ 18 февраля 2020

Вы можете взять таблицу ha sh и отфильтровать массив, проверив Name и Language.

var array = [{ Name: "blah", Date: "1992-02-18T00:00:00.000Z", Language: "English" }, { Name: "blahzay", Date: "1998-02-18T00:00:00.000Z", Language: "French" }, { Name: "blah", Date: "1999-02-18T00:00:00.000Z", Language: "English" }],
    hash = {},
    result = array.filter(({ Name, Language }) => {
        var key = `${Name}|${Language}`;
        if (!hash[key]) return hash[key] = true;
    });

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 18 февраля 2020

Я бы использовал модуль подчеркивания для JavaScript и уникальную функцию в этом сценарии. Вот пример массива объектов данных:

let data = [{
    name: 'blah',
    date: Date.now(),
    language: "en"
},
{
    name: 'noblah',
    date: Date.now(),
    language: 'es'
},
{
    name: 'blah',
    date: Date.now(),
    language: 'en'
}];

Затем мы можем использовать уникальную функцию в библиотеке подчеркивания, чтобы вернуть только копию данных, которые имеют уникальные значения, связанные с языковым ключом:

const result = _.unique(data, 'language');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...