Найти совпадающие свойства в массиве объектов (angular5)

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

Пример:

[{id: 1, firstname: 'Bob', Lastname: 'Lupo'}, {id: 2, firstname: 'Tessa', Lastname: 'Moon'},
{id: 3, firstname: 'Erik' , Lastname: 'Deurne'}, {id: 4, firstname: 'Bob', Lastname: 'Lupo'}, {id: 5, firstname: 'Bob' , Lastname: 'Lupo'}]

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

Так что в этом случае это будет [[1,4,5]]

Кто-нибудь знает, как это сделать?

Спасибо

что ты пробовал?

GibboK 20.07.2018 14:15

@GibboK цикл в цикле, который может работать, но это не чистый способ сделать это

user3356007 20.07.2018 14:16
Поведение ключевого слова "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) для оценки ваших знаний,...
1
2
64
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

var data = [{
        id: 1,
        firstname: 'Bob',
        Lastname: 'Lupo'
    }, {
        id: 2,
        firstname: 'Tessa',
        Lastname: 'Moon'
    },
    {
        id: 3,
        firstname: 'Erik',
        Lastname: 'Deurne'
    }, {
        id: 4,
        firstname: 'Bob',
        Lastname: 'Lupo'
    }, {
        id: 5,
        firstname: 'Bob',
        Lastname: 'Lupo'
    }
];

var result = data.reduce((obj, val) => {
    obj[val.firstname + "_" + val.Lastname] = obj[val.firstname + "_" + val.Lastname] || [];
    obj[val.firstname + "_" + val.Lastname].push(val.id);
    return obj;
}, {});

result = Object.values(result).filter(val=>val.length>1);

console.info(result);

Это, однако, утверждает, что ни firstname, ни Lastname не содержат _. Никогда не знаешь ¯ \ _ (ツ) _ / ¯

Ahmed Bajra 20.07.2018 15:05

Шаг 1 - составить дерево всех комбинаций firstname-lastname и их идентификаторов. Мы можем сделать это в одном reduce с данными. (примечание: если вы можете придумать хэш-функцию для своих объектов, которую можно безопасно использовать, вам не нужны 2 уровня в этом дереве)

[ { id, firstname, lastname } ] -> { firstname: { lastname: [ id ] } }

console.info(
  getData().reduce(
    (tree, person) => {
      if (!tree[person.firstname])
        tree[person.firstname] = {};
      if (!tree[person.firstname][person.Lastname]) 
        tree[person.firstname][person.Lastname] = [];


      tree[person.firstname][person.Lastname].push(person.id);
      return tree;
    }, {}
  )
);


function getData() { return [{id: 1, firstname: 'Bob', Lastname: 'Lupo'}, {id: 2, firstname: 'Tessa', Lastname: 'Moon'},
{id: 3, firstname: 'Erik' , Lastname: 'Deurne'}, {id: 4, firstname: 'Bob', Lastname: 'Lupo'}, {id: 5, firstname: 'Bob' , Lastname: 'Lupo'}] };

Когда у нас есть это дерево, мы можем перейти к шагу 2. Мы сводим дерево только к наборам идентификаторов. Затем мы отфильтровываем все наборы идентификаторов, которые содержат только один идентификатор, используя filter:

{ firstname: { lastname: [ id ] } } -> [ [ id ] ]

const flattenTree = tree => Object.entries(tree)
  .reduce(
    (acc, [k, v]) => Object.entries(v).reduce(
        (acc, [k, v]) => acc.concat([v]),
        acc
      ),
    []
  );
  
const duplicates = xxs => xxs.filter(xs => xs.length > 1);

console.info(
  duplicates(
    flattenTree(getTree())
  )
);



function getTree() {
  return getData().reduce(
    (tree, person) => {
      if (!tree[person.firstname])
        tree[person.firstname] = {};
      if (!tree[person.firstname][person.Lastname]) 
        tree[person.firstname][person.Lastname] = [];


      tree[person.firstname][person.Lastname].push(person.id);
      return tree;
    }, {}
  )
};

function getData() { return [{id: 1, firstname: 'Bob', Lastname: 'Lupo'}, {id: 2, firstname: 'Tessa', Lastname: 'Moon'},
{id: 3, firstname: 'Erik' , Lastname: 'Deurne'}, {id: 4, firstname: 'Bob', Lastname: 'Lupo'}, {id: 5, firstname: 'Bob' , Lastname: 'Lupo'}] };
Ответ принят как подходящий

Попробуйте этот код

var array = [{id: 1, firstname: 'Bob', Lastname: 'Lupo'}, {id: 2, firstname: 'Tessa', Lastname: 'Moon'},
{id: 3, firstname: 'Erik' , Lastname: 'Deurne'}, {id: 4, firstname: 'Bob', Lastname: 'Lupo'}, {id: 5, firstname: 'Bob' , Lastname: 'Lupo'}]

let duplicates = {}

array.map(item => {
    let key=item.firstname+'_'+item.Lastname
    if ( !duplicates[ key ]){
        duplicates[ key ] = []
    }
    duplicates[ key ].push(item.id)
},{})

duplicateNamesIds = []
Object.values( duplicates ).forEach( value => {
    if ( value.length > 1 ){
        duplicateNamesIds.push( value )
    }
})
console.info(duplicateNamesIds)

отличный код только; y value.length дает ошибку, и зачем нам это значение, которое уже имеет соответствующие идентификаторы?

user3356007 20.07.2018 15:00

Как насчет этого:

const data = [
  {id: 1, firstname: 'Bob', Lastname: 'Lupo'}, 
  {id: 2, firstname: 'Tessa', Lastname: 'Moon'},
  {id: 3, firstname: 'Erik' , Lastname: 'Deurne'}, 
  {id: 4, firstname: 'Bob', Lastname: 'Lupo'}, 
  {id: 5, firstname: 'Bob' , Lastname: 'Lupo'}
]

// Definitely not the most beautiful code I've ever written
let result = Object.values(
  data.reduce((a, c) => {
    a[c.firstname] = a[c.firstname] || {};
    a[c.firstname][c.Lastname] = [...(a[c.firstname][c.Lastname] || []), c.id];
    return a;
  }, []))
  .map(o => [].concat(...Object.values(o)))
  .filter(arr => arr.length > 1); 

console.info(result);

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