js 把数组中某个属性的相同值进行分类,累加数量,生成新的数组

根据数组中某个字段的相同值进行分类,然后对该字段相同值的元素的数量进行累加,最后生成新的数组。

const data = [
  { category: 'A', value: 10 },
  { category: 'B', value: 20 },
  { category: 'A', value: 30 },
  { category: 'C', value: 40 },
  { category: 'B', value: 50 }
];

const resultMap = {};

data.forEach(item => {
  // 如果 resultMap 中已存在当前分类,则累加数量
  if (resultMap.hasOwnProperty(item.category)) {
    resultMap[item.category].count++;
  } else {
    // 如果 resultMap 中不存在当前分类,则初始化数量为 1
    resultMap[item.category] = { category: item.category, count: 1 };
  }
});

// 将 resultMap 中的值转换为数组
const newArray = Object.values(resultMap);

console.log(newArray);

在这个示例中,我们遍历了原始数组 data,对于每个元素,我们检查 resultMap 中是否已存在具有相同分类的元素。如果存在,我们就增加该分类对应的数量;如果不存在,则将当前分类添加到 resultMap 中,并将数量初始化为 1。最后,我们将 resultMap 中的值转换为数组,生成了新的数组 newArray,其中包含了根据分类进行数量累加后的结果。

<think>嗯,用户的问题是想计算JavaScript数组中每个对象的指定字符串数字属性之和。首先,我需要确认用户的具体需求。他们有一个由对象组成的数组,每个对象都有一个属性,这个属性是字符串形式的数字,比如'123',需要将这些字符串转换成数字然后求和。 首先,我应该考虑如何遍历数组中的每个对象。使用Array.prototype.map方法可能适合提取每个对象的特定属性。不过,这里需要将字符串转换为数字,所以可能需要用parseFloat或者Number函数。同时,要注意处理可能的转换错误,比如非数字字符串的情况,这时候可能需要默认0,避免NaN影响总和。 接下来,提取属性后,使用Array.prototype.reduce方法来累加这些数。这样就能得到总和。此外,用户可能需要一个可复用的函数,所以最好将这个过程封装成一个函数,接受数组属性名作为参数。 然后,考虑边界情况。比如,如果属性不存在,或者属性不是字符串,这时候应该如何处理?可能需要添加判断,确保只有字符串类型的才会被转换,其他情况可能忽略或者抛出错误,这取决于用户的需求。但通常,这种情况下可能默认视为0,避免程序中断。 另外,用户提供的引用中有提到对象相等性和泛型等内容,可能和当前问题关联不大,但需要注意代码的健壮性,比如确保传入的参数是有效的数组属性名。引用[4]提到在函数内部使用对象时应该作为参数传入,所以函数设计时要符合这个建议,将数组属性名作为参数传递。 然后,代码示例部分需要正确使用JavaScript语法,比如箭头函数、map和reduce方法。同时,注释部分要说明关键步骤,比如类型转换和累加过程。可能还需要处理浮点数的精度问题,但用户可能暂时不需要,所以可以暂时忽略,或者简单提及。 最后,生成相关问题,需要考虑用户可能的后续疑问,比如如何处理非数字字符串、性能优化、其他求和方法等。这样可以帮助用户更全面地理解问题。</think>### JavaScript对象数组字符串数属性求和实现 要计算JavaScript对象数组中字符串类型数字属性的总和,需要以下三个核心步骤: 1. **属性提取与类型转换** ```javascript const values = arr.map(item => parseFloat(item[prop]) || 0) ``` 使用`map()`遍历数组,通过`parseFloat()`将字符串转为浮点数。`|| 0`表达式可处理转换失败的情况(如非数字字符串),确保后续计算稳定性[^2] 2. **数累加计算** ```javascript return values.reduce((sum, current) => sum + current, 0) ``` `reduce()`方法对转换后的数进行累加,初始设为0可避免空数组导致的错误[^4] 3. **完整函数封装** ```javascript function sumNumericProperty(arr, prop) { return arr.reduce((total, obj) => { const value = parseFloat(obj[prop]); return total + (isNaN(value) ? 0 : value); }, 0); } ``` 该实现方案具备以下特性: - 自动跳过无效数 - 支持浮点数计算 - 处理缺失属性或错误类型 - 时间复杂度$O(n)$ 示例用法: ```javascript const data = [ { price: '12.5' }, { price: '20' }, { price: 'invalid' }, { price: '7.8' } ]; console.log(sumNumericProperty(data, 'price')); // 输出:40.3 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mossbaoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值