首页 > 解决方案 > 使数组中对象的出现成为属性

问题描述

我正在尝试向数组中的多个对象添加一个新属性,以计算其出现次数。当前函数可以删除重复的对象,但无法计算重复的次数。

const artists = [
    { name: 'Paul',   age: '18', 'id': 1 },
    { name: 'Joseph', age: '21', 'id': 2 },
    { name: 'Maggie', age: '20', 'id': 3 },
    { name: 'Paul',   age: '18', 'id': 1 },
    { name: 'Maggie', age: '20', 'id': 3 },
    { name: 'John',   age: '18', 'id': 4 },
    { name: 'Joseph', age: '21', 'id': 2 },
    { name: 'Tenner', age: '30', 'id': 5 },
    { name: 'Maggie', age: '20', 'id': 3 },
]

const countOccurrence = (arr) => {
    let uniqueArray = []

    uniqueArray = arr.filter(item => {
        item['occurrence'] = ++item['occurrence'] || 1
        if (!uniqueArray.includes(item.id)) {
            uniqueArray.push(item.id)
            return true
        }
    })

    return uniqueArray
}

let uniqueArtists = countOccurrence(artists)
console.log(uniqueArtists)

我越来越:

[
  { name: 'Paul',   age: '18', id: 1, occurrence: 1 },
  { name: 'Joseph', age: '21', id: 2, occurrence: 1 },
  { name: 'Maggie', age: '20', id: 3, occurrence: 1 },
  { name: 'John',   age: '18', id: 4, occurrence: 1 },
  { name: 'Tenner', age: '30', id: 5, occurrence: 1 }
]

我试图得到:

[
  { name: 'Paul',   age: '18', id: 1, occurrence: 2 },
  { name: 'Joseph', age: '21', id: 2, occurrence: 2 },
  { name: 'Maggie', age: '20', id: 3, occurrence: 3 },
  { name: 'John',   age: '18', id: 4, occurrence: 1 },
  { name: 'Tenner', age: '30', id: 5, occurrence: 1 }
]

顺序无关紧要,我只是想获得正确的出现值。

标签: javascriptarrays

解决方案


您可以使用哈希表并增加每个分组工作人员的出现次数。

这种方法不会改变原始数据。

const
    workers = [{ name: 'Paul',   age: '18', id: 1 }, { name: 'Joseph', age: '21', id: 2 }, { name: 'Maggie', age: '20', id: 3 }, { name: 'Paul',   age: '18', id: 1 }, { name: 'Maggie', age: '20', id: 3 }, { name: 'John',   age: '18', id: 4 }, { name: 'Joseph', age: '21', id: 2 }, { name: 'Tenner', age: '30', id: 5 }, { name: 'Maggie', age: '20', id: 3 }],
    countOccurrence = (arr) => {
        let uniqueArray = [],
            hashTable = {}

        arr.forEach(item => {
            if (!hashTable[item.id]) {
                uniqueArray.push(hashTable[item.id] = { ...item, occurrence: 0 });
            }
            hashTable[item.id].occurrence++;
        });

        return uniqueArray;
    },
    uniqueArtists = countOccurrence(workers);

console.log(uniqueArtists);
.as-console-wrapper { max-height: 100% !important; top: 0; }

通过使用对象并将值作为返回数组获取的方法略有不同。

const
    workers = [{ name: 'Paul',   age: '18', id: 1 }, { name: 'Joseph', age: '21', id: 2 }, { name: 'Maggie', age: '20', id: 3 }, { name: 'Paul',   age: '18', id: 1 }, { name: 'Maggie', age: '20', id: 3 }, { name: 'John',   age: '18', id: 4 }, { name: 'Joseph', age: '21', id: 2 }, { name: 'Tenner', age: '30', id: 5 }, { name: 'Maggie', age: '20', id: 3 }],
    countOccurrence = (arr) => {
        let hashTable = {}

        arr.forEach(item => {
            if (!hashTable[item.id]) {
                hashTable[item.id] = { ...item, occurrence: 0 };
            }
            hashTable[item.id].occurrence++;
        });

        return Object.values(hashTable);
    },
    uniqueArtists = countOccurrence(workers);

console.log(uniqueArtists);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读