Добавить значение счетчика к объекту с такими же значениями ключа (массив объектов) - PullRequest
0 голосов
/ 24 апреля 2019

Здравствуйте. У меня сложная итерация, выполняемая над массивом объектов.У меня есть массив, как это:

[ 
  { name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Jacob', lastName: 'Smith', dob: '1991-08-21' },
  { name: 'Ann', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Ann', lastName: 'Nansen', dob: '1983-01-01' },
  { name: 'Jacob', lastName: 'Smith', dob: '1985-06-15' },
  { name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Ann', lastName: 'Smith', dob: '2010-11-29' },
]

Я хотел бы добавить свойство count для каждого объекта, который считает объекты с одинаковыми именем и фамилией ... Так должно быть сейчас:

[ 
  { name: 'Jacob', lastName: 'Smith', count: 4 },
  { name: 'Ann', lastName: 'Smith', count: 2 },
  { name: 'Ann', lastName: 'Nansen', count: 1' },
]

Ответы [ 5 ]

3 голосов
/ 24 апреля 2019

Вы можете использовать Array.reduce и Object.values ​​

  • Преобразование массива в объект с ключом в качестве имени и комбинации фамилии со значением, являющимся результирующим объектом.
  • Из объекта получить все значения как конечный результат

let arr = [{ name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },{ name: 'Jacob', lastName: 'Smith', dob: '1991-08-21' },{ name: 'Ann', lastName: 'Smith', dob: '1995-11-29' },{ name: 'Ann', lastName: 'Nansen', dob: '1983-01-01' },{ name: 'Jacob', lastName: 'Smith', dob: '1985-06-15' },{ name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },{ name: 'Ann', lastName: 'Smith', dob: '2010-11-29' }];

let result = Object.values(arr.reduce((a,{name, lastName}) => {
  let key = `${name}_${lastName}`;
  a[key] = a[key] || {name, lastName, count : 0};
  a[key].count++;
  return a;
}, {}));

console.log(result);
0 голосов
/ 24 апреля 2019

Этого можно добиться, уменьшив исходный массив.Выполняя итерацию по people, вы можете проверить, были ли они уже «сгруппированы», используя Array.some - если этого не произошло, подтолкните созданный объект Object к ранее возвращенному массиву.

const getInstances = ({ name, lastName }, data) => data.filter(d => d.name === name && d.lastName === lastName).length

const people = [ 
  { name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Jacob', lastName: 'Smith', dob: '1991-08-21' },
  { name: 'Ann', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Ann', lastName: 'Nansen', dob: '1983-01-01' },
  { name: 'Jacob', lastName: 'Smith', dob: '1985-06-15' },
  { name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Ann', lastName: 'Smith', dob: '2010-11-29' },
]
  
const groupedPeople = people.reduce((group, person, i, people) => {
  const alreadyBeenGrouped = group.some(({ name, lastName }) => name === person.name && lastName === person.lastName)

  if (!alreadyBeenGrouped) {
    group.push({
      name: person.name,
      lastName: person.lastName,
      count: getInstances(person, people)
    })
  }

  return group
}, [])

console.log(groupedPeople)
0 голосов
/ 24 апреля 2019

let arr=[ 
  { name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Jacob', lastName: 'Smith', dob: '1991-08-21' },
  { name: 'Ann', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Ann', lastName: 'Nansen', dob: '1983-01-01' },
  { name: 'Jacob', lastName: 'Smith', dob: '1985-06-15' },
  { name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },
  { name: 'Ann', lastName: 'Smith', dob: '2010-11-29' },
];



let outerArr=[];

for(arrValue of arr)
{
  delete arrValue.dob

  let index=outerArr.findIndex(item=> item.name==arrValue.name && 
  item.lastName==arrValue.lastName);

  if(index==-1)
  {
	let arrFind=arr.filter(item=> item.name==arrValue.name && 
    item.lastName==arrValue.lastName)
     arrValue.count=arrFind.length
     outerArr.push(arrValue)
  }

}
	console.log('result',outerArr)
0 голосов
/ 24 апреля 2019

Вы можете использовать JSON.stringify для безопасного сочетания имени и фамилии.Мне нравится использовать Map для группировки записей с одинаковыми ключами:

const data = [{ name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },{ name: 'Jacob', lastName: 'Smith', dob: '1991-08-21' },{ name: 'Ann', lastName: 'Smith', dob: '1995-11-29' },{ name: 'Ann', lastName: 'Nansen', dob: '1983-01-01' },{ name: 'Jacob', lastName: 'Smith', dob: '1985-06-15' },{ name: 'Jacob', lastName: 'Smith', dob: '1995-11-29' },{ name: 'Ann', lastName: 'Smith', dob: '2010-11-29' }];
const keyed = data.map(o => [JSON.stringify([o.name, o.lastName]), o]);
const map = new Map(keyed.map(([key, {name, lastName}]) => 
                              [key, {name, lastName, count: 0}]));
keyed.forEach(([key, o]) => map.get(key).count++);
const result = Array.from(map.values());

console.log(result);
0 голосов
/ 24 апреля 2019
  const hash = [];

  for(const { name, lastName } of persons) {
    const key = name + "/" + lastName;
    if(!hash[key]) hash[key] = {
      name,
      lastName,
      count: 0,
    };

    hash[key].count++;
 }

  const result = Object.values(hash);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...