Как удалить повторяющееся название места, которое содержит одно и то же имя?

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

Я сделал вилка примера, который я изменил.

Функция связана:

const uniqueArray = things.thing.filter((thing,index) => {
  return index === things.thing.findIndex(obj => {
    return JSON.stringify(obj) === JSON.stringify(thing);
  });
});

Например, у меня есть:

[
  {"place":"here","name":"stuff"},
  {"place":"there","name":"morestuff"},
  {"place":"there","name":"morestuff"},
  {"place":"herehere","name":"stuff"}
]

Он вернет:

[
  {"place":"here","name":"stuff"},
  {"place":"there","name":"morestuff"},
  {"place":"herehere","name":"stuff"}
]

Как удалить повторяющееся place имя, которое содержит одно и то же name?

Ожидаемый результат:

[
  {"place":"here","name":"stuff"},
  {"place":"there","name":"morestuff"}
]

Вместо этого вы можете использовать Array.reduce, где аккумулятор является «отфильтрованным» объектом, а следующий элемент помещается только в том случае, если аккумулятор не содержит желаемого элемента. const uniqueArray = things.thing.reduce((acc, next) => { if (acc.find(i => i.place === next.place)) return acc; else return (acc.push(next), acc); }, []);

briosheje 09.04.2019 12:41

Извините, я забыл указать ожидаемый результат.

Shinjo 09.04.2019 12:48
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
69
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проверь это

  const things = [
        {"place":"here","name":"stuff"},
        {"place":"there","name":"morestuff"},
        {"place":"there","name":"morestuff"},
        {"place":"herehere","name":"stuff"}
    ]

    const uniqueArray = things.reduce((accumulator, currentValue) => {
        if (accumulator.find(a => a.name === currentValue.name))
            return accumulator;
        else
            return (accumulator.push(currentValue), accumulator);
    }, []);

Выход

    [ { place: 'here', name: 'stuff' },
      { place: 'there', name: 'morestuff' } ]
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… проверьте это, вы можете понять, как это работает
Dinesh 09.04.2019 12:58

Вы можете использовать уменьшение массива с фильтром

let data=[
  {"place":"here","name":"stuff"},
  {"place":"there","name":"morestuff"},
  {"place":"there","name":"morestuff"},
  {"place":"herehere","name":"stuff"}
]

// Using reduce() to separate the contents we want
let result=data.reduce((acc,value)=>{
  if (acc.filter(val=>val.name==value.name).length==0) // checking the accumulator if it already containsa the value
  {
    acc.push(value); // if the array returned is of length==0 we can push in it
  }
return acc;

},[])
console.info(result);

См. Фильтр массива, Массив.прототип.Уменьшить

Ответ принят как подходящий

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

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

const arr = [
  {"place":"here","name":"stuff"},
  {"place":"there","name":"morestuff"},
  {"place":"there","name":"morestuff"},
  {"place":"herehere","name":"stuff"}
];

// Accepts an array and a key that should have the
// duplicates removed
function remove(arr, key) {

  // Iterate over the array passing in the accumulator
  // and the current element
  return arr.reduce((acc, c) => {

    // If there is an object in the accumulator with the
    // same key value as the current element simply return the
    // accumulator
    if (acc.find(obj => obj[key] === c[key])) return acc;

    // Otherwise add the current element to the accumulator
    // and return it
    return acc.concat(c);
  }, []);
}

function showJSON(arr, id) {
  const json = JSON.stringify(arr, null, 2);
  document.querySelector(`#${id} code`).textContent = json;
}

// remove duplicate places
showJSON(remove(arr, 'place'), 'places');

// remove duplicate names
showJSON(remove(arr, 'name'), 'names');
<div id = "places">
Removed duplicate places
<pre><code></code></pre>
</div>

<div id = "names">
Removed duplicate names
<pre><code></code></pre>
</div>

Другие вопросы по теме