簡體   English   中英

將計數值添加到具有相同鍵值的對象(對象數組)

[英]Add count value to object with same key values (array of objects)

您好,我要對一系列對象進行復雜的迭代。 我有這樣的數組:

[ 
  { 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' },
]

您可以使用Array.reduceObject.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); 

  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);

您可以使用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); 

 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) 

您可以通過減少原始數組來實現。 在遍歷people ,可以檢查是否已使用Array.some對它們進行“分組”-如果尚未將其構建的對象推入先前返回的Array。

 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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM