向数组添加重复标识对象时合并属性值的实现方法
实现思路
核心逻辑是新增对象前先校验数组中是否存在同标识的对象,存在则累加属性,不存在则直接插入:
- 先定义对象的唯一标识字段,这类股票场景的标识字段通常为
symbol - 插入新对象前遍历数组,匹配相同标识的已有对象
- 匹配成功则累加
fees、amount两个属性值,无需新增元素 - 匹配失败则直接将新对象推入数组,保证唯一标识对应的对象全局唯一
代码实现(JavaScript 示例)
// 示例原数组 const stockList = [ { symbol: 'AAPL', fees: 23.5, amount: 10 }, { symbol: 'TSLA', fees: 12.8, amount: 7 } ] /** * 新增/更新股票对象 * @param {Array} list 原股票数组 * @param {Object} newStock 新增的股票对象 */ function addOrUpdateStock(list, newStock) { // 查找同标识的已有对象 const existStock = list.find(item => item.symbol === newStock.symbol) if (existStock) { // 存在则累加对应属性 existStock.fees += newStock.fees existStock.amount += newStock.amount } else { // 不存在则直接插入 list.push(newStock) } } // 测试:新增AAPL对象 const newAapl = { symbol: 'AAPL', fees: 10, amount: 5 } addOrUpdateStock(stockList, newAapl) console.log(stockList) // 输出中AAPL对象为 { symbol: 'AAPL', fees: 33.5, amount: 15 },无重复AAPL对象
扩展说明
如果需要适配任意标识、任意累加字段,可以把标识字段名、累加字段列表作为参数传入函数,提升通用性:
function addOrMergeItem(list, newItem, uniqueKey, mergeKeys) { const existItem = list.find(item => item[uniqueKey] === newItem[uniqueKey]) if (existItem) { mergeKeys.forEach(key => { existItem[key] = (existItem[key] || 0) + (newItem[key] || 0) }) } else { list.push(newItem) } } // 调用示例:按symbol为唯一标识,累加fees、amount addOrMergeItem(stockList, newAapl, 'symbol', ['fees', 'amount'])
内容的提问来源于stack exchange,提问作者fernon
相关产品推荐
相关产品推荐

