javascript - 使数组中对象的出现成为属性
问题描述
我正在尝试向数组中的多个对象添加一个新属性,以计算其出现次数。当前函数可以删除重复的对象,但无法计算重复的次数。
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 }
]
顺序无关紧要,我只是想获得正确的出现值。
解决方案
您可以使用哈希表并增加每个分组工作人员的出现次数。
这种方法不会改变原始数据。
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; }
推荐阅读
- jquery - jQueryUI Combobox 不呈现“选择一个...”选项与空值
- amazon-web-services - 如何从 Hive 更新 DynamoDB 表
- arrays - 过滤数组元素以添加到 listView
- mysql - 为什么 MySQL Workbench 执行查询比我的应用程序慢得多?
- wordpress - 从“woocommerce_before_main_content”功能中排除产品页面
- slurm - 列出每个状态的作业数
- mysql - MySQL LOAD DATA LOCAL INFILE 不允许通过 ODBC
- aws-lambda - 调用amazondax服务时获取权限异常
- r - 如何读取 DNAstring 的核苷酸序列
- mesos - 无法开始马拉松状态=1/FAILURE