Получить дубликаты от объекта в Angularjs - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужна помощь с getting duplicate Object from the Object, я застреваю.

Например

My Object = {1: 'cat', 2: 'dog', 3: 'cat'}

Ожидаемый результат должен быть

{1: 'cat'}

Ответы [ 4 ]

0 голосов
/ 06 декабря 2018

Вот еще одна реализация, основанная на Array.reduce:

const o = { 1: 'cat', 2: 'dog', 3: 'cat' }

const result = Object.entries(o).reduce((r, [k,v], idx, arr) => {
  r[v] = [...(r[v] || []), { [k]: v }]
  return idx == arr.length-1 ? Object.values(r).find(x => x.length > 1)[0] : r
}, {})
console.log(result)

Здесь он разбит с более подробной информацией:

const object = { 1: 'cat', 2: 'dog', 3: 'cat' }

const result = 
  Object.entries(object)  // get object key & value in the form of [key,value]
  .reduce((accumulator, [k,v], index, array) => {  // start an `Array.reduce`
  // create the grouping on the value `cat`/`dog`
  accumulator[v] = [...(accumulator[v] || []), { [k]: v }] 
  if(index == array.length-1)  // if we are at the end of the `Array.reduce`
    // Return the values of the accumulator filtered by the arrays which length is more than 1
    // and take from that array the initial element 
    return Object.values(accumulator).find(x => x.length > 1)[0]
  else // Not at the end keep returning the accumulator
    return accumulator
}, {})

console.log(result)
0 голосов
/ 06 декабря 2018

Вы можете сосчитать вхождения с картой и получить первую найденную пару ключ / значение для набора результатов.

var object = { 1: 'cat', 2: 'dog', 3: 'cat' },
    result = Object.assign(
        ...Array.from(
            Object
                .entries(object)
                .reduce((m, [k, v]) => (([l, c]) => m.set(v, [l, c + 1]))(m.get(v) || [k, -1]), new Map),
            ([v, [k, c]]) => c && { [k]: v }
        )
    );

console.log(result);
0 голосов
/ 06 декабря 2018

Используя lodash, вы можете преобразовать объект в массив пар, сгруппировать их по значению, удалить группы без дубликатов и преобразовать обратно в массив:

const object = { 1: 'cat', 2: 'dog', 3: 'cat' }

const fn = _.flow([
  _.toPairs, // convert to pairs [key, value]
  o => _.groupBy(o, _.last), // group the pairs by the value
  o => _.filter(o, g => g.length > 1), // filter out group with no duplicates
  o => _.map(o, _.first), // get the 1st item from each group
  _.fromPairs // convert back to object
])

const result = fn(object)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 06 декабря 2018

ИСПОЛЬЗУЙТЕ что-то вроде этого,

var answers =  {1: 'cat', 2: 'dog', 3: 'cat'}

var keys = Object.keys(answers);
var dupe = {};

for(var i=0;i<keys.length;i++){
 for(var j=i+1;j<keys.length;j++){
   if(answers[keys[i]] === answers[keys[j]]){
     dupe[keys[i]] = answers[keys[i]];
   }
 }
}
  console.log(dupe)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...