Как вернуть все дублированные объекты с одинаковыми значениями в JS? - PullRequest
1 голос
/ 29 сентября 2019

Есть ли умный способ получить все объекты с одинаковым значением?

[
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
]

идеальный результат:

[
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'}
]

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

Цени!

Ответы [ 4 ]

2 голосов
/ 29 сентября 2019

Вы можете взять Map и отфильтровать массив по значению карты.

var array = [{ name: 'a' , value: '123' }, { name: 'b' , value: '123' }, { name: 'c' , value: '1234' }, { name: 'd' , value: '1234' }, { name: 'e' , value: '12345' }, { name: 'f' , value: '123456' }],
    counts = array.reduce((m, { value }) => m.set(value, m.has(value)), new Map),
    result = array.filter(({ value }) => counts.get(value));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 29 сентября 2019

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

Вот пример:

const valuesMap = {}
const input = [
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
]

input.forEach(item => {
    if (!valuesMap[item.value]) {
         valuesMap[item.value] = 1
    } else {
         valuesMap[item.value] += 1
    }
})

const output = input.filter(item => {
     return valuesMap[item.value] > 1
})
0 голосов
/ 29 сентября 2019

Простое использование решения уменьшить с примесью (карта не нужна снова.)

const data = [
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
]
const final = []
const counter = (data) => {
  return data.reduce((x, i) => {
    if(!x[i.value]) x[i.value] = 0
    x[i.value]++
    if(x[i.value] > 2) final.push(i)
    if(x[i.value] > 1) final.push(i, i)
    return x;
  }, {})
}
counter(data)
console.log(final)
0 голосов
/ 29 сентября 2019

Я думаю, что вы ищете алгоритмы сортировки, а затем, возможно, функцию фильтра.

надеюсь, это вам поможет.

вы можете отсортировать код, выполнив это:

let data = [
  { name: 'a' , value: '123'},
  { name: 'b' , value: '123'},
  { name: 'c' , value: '1234'},
  { name: 'd' , value: '1234'},
  { name: 'e' , value: '12345'},
  { name: 'f' , value: '123456'}
];

let cleanData = data.sort((a, b) = >{
    return a.value > b.value;
});

cleanData.filter((data) => data.value === 'requestedValue');

Я не уверен в эффективности, но это позволит вам получить желаемый результат.Кстати, вы можете просто пропустить фазу заказа, которую я сделал.

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