У меня есть массив с объектами. Я хочу знать, совпадают ли определенные свойства объекта, и сохранять совпадения в новом массиве.
Пример:
[{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 цикл в цикле, который может работать, но это не чистый способ сделать это



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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 не содержат _. Никогда не знаешь ¯ \ _ (ツ) _ / ¯
Шаг 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 дает ошибку, и зачем нам это значение, которое уже имеет соответствующие идентификаторы?
Как насчет этого:
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);
что ты пробовал?