Как удалить повторяющиеся значения данных из массива объектов в javascript? - PullRequest
1 голос
/ 25 апреля 2020

Я хочу иметь возможность использовать методы массива или какую-либо другую форму обработки javascript без какой-либо внешней javascript библиотеки для итерации по многомерному массиву и удалите все повторяющиеся значения. Вот пример ниже:

var places = [{
    "category": "other",
    "title": "harry University",
    "value": 4788,
    "id": "1"
  },
  {
    "category": "traveling",
    "title": "tommy University",
    "value": 5460,
    "id": "2"
  },
  {
    "category": "education",
    "title": "jerry University",
    "value": 7853456,
    "id": "3"
  },
  {
    "category": "business",
    "title": "Charlie University",
    "value": 6779589,
    "id": "4"
  },
  {
    "category": "business",
    "title": "NYU",
    "value": 0117824,
    "id": "5"
  }
];

Я пытался использовать array.filter для удаления дублирующихся значений category, но выбранный мной подход не работает.

Вот мой код

places = places.map(JSON.stringify).reverse()
  .filter(function(item, index, places) {
    return places.indexOf(item, index + 1) === -1;
  })
  .reverse().map(JSON.parse)
console.log(places)

Выше не работает, потому что он работает на весь массив, поэтому данные не изменяются.

Когда я использую библиотеку, такую ​​как подчеркивание. js у них есть метод, который работает

let newPlaces = [];
_.each(_.uniq(_.pluck(places, "category")), function(category) {
  newPlaces.push(_.findWhere(places, {
    category: category
  }));
});
console.log(newPlaces);

Но я хочу использовать .filter или какой-нибудь другой ванильный javascript метод.

Ответы [ 2 ]

1 голос
/ 25 апреля 2020

Ваш пример не является многомерным массивом. Но просто обычный массив объектов. Многомерный массив будет что-то вроде let a = [[1],[1]];, который является массивом массивов. В любом случае, вы хотите просто удалить все объекты (элементы в массиве), для которых категория уже появилась однажды. Вы можете сделать это с помощью фильтра Vanilla Javascript, как вы хотели. Вы просто должны использовать объект, чтобы вести учет того, появился ли объект раньше или нет. Вот простой подход

function removeDuplicates(arrToBeFiltered, keyToMatch){
  let dups = {};
  return arrToBeFiltered.filter(function(item){ 
    if(item[keyToMatch] in dups){return false;} 
    else {
        dups[item[keyToMatch]] = true; return true;
    }}); 
}
places = removeDuplicates(places,'category');
0 голосов
/ 25 апреля 2020

Простой для L oop. Просто вызовите DeDupPlaces с массивом и строковым фильтром.

const DeDupPlaces = (arrToBefiltered, filter) => {
  const seen = [];
  const result = [];
  for (let i = 0; i < arrToBefiltered.length; i++) {
    const filterValue = arrToBefiltered[i][filter];

    if(!seen.includes(filterValue)){
        seen.push(filterValue);
        result.push(arrToBefiltered[i]);
    }
  }
  return result;
}
DeDupPlaces(places, 'category');

JS Fiddle с вашим примером

...