当前位置: 首页 > 面试题库 >

JavaScript对数组中的属性值求和的更好方法

祁均
2023-03-14
问题内容

我有这样的事情:

$scope.traveler = [
            {  description: 'Senior', Amount: 50},
            {  description: 'Senior', Amount: 50},
            {  description: 'Adult', Amount: 75},
            {  description: 'Child', Amount: 35},
            {  description: 'Infant', Amount: 25 },
];

现在要拥有此数组的总数量,我正在做这样的事情:

$scope.totalAmount = function(){
       var total = 0;
       for (var i = 0; i < $scope.traveler.length; i++) {
              total = total + $scope.traveler[i].Amount;
            }
       return total;
}

当只有一个数组时,这很容易,但是我想对其他具有不同属性名称的数组进行总结。

如果我可以做这样的事情,我会更开心:

$scope.traveler.Sum({ Amount });

但我不知道该如何处理,以至于我将来可以像这样重用它:

$scope.someArray.Sum({ someProperty });

回答

我决定使用@ gruff-bunny建议,因此避免原型原型本机对象(数组)

我只是对他的答案做了一些修改,以验证数组,并且sum的值不为null,这是我的最终实现:

$scope.sum = function (items, prop) {
    if (items == null) {
        return 0;
    }
    return items.reduce(function (a, b) {
        return b[prop] == null ? a : a + b[prop];
    }, 0);
};

问题答案:

更新的答案

由于将函数添加到Array原型的所有弊端,我正在更新此答案以提供使语法与问题中最初要求的语法相似的替代方法。

class TravellerCollection extends Array {
    sum(key) {
        return this.reduce((a, b) => a + (b[key] || 0), 0);
    }
}
const traveler = new TravellerCollection(...[
    {  description: 'Senior', Amount: 50},
    {  description: 'Senior', Amount: 50},
    {  description: 'Adult', Amount: 75},
    {  description: 'Child', Amount: 35},
    {  description: 'Infant', Amount: 25 },
]);

console.log(traveler.sum('Amount')); //~> 235

原始答案

由于它是一个数组,因此您可以向Array原型添加一个函数。

traveler = [
    {  description: 'Senior', Amount: 50},
    {  description: 'Senior', Amount: 50},
    {  description: 'Adult', Amount: 75},
    {  description: 'Child', Amount: 35},
    {  description: 'Infant', Amount: 25 },
];

Array.prototype.sum = function (prop) {
    var total = 0
    for ( var i = 0, _len = this.length; i < _len; i++ ) {
        total += this[i][prop]
    }
    return total
}

console.log(traveler.sum("Amount"))


 类似资料:
  • 如何处理对象的javascript数组,例如: 并通过求和这些值合并重复的键。为了得到这样的东西: 我尝试过迭代并添加到一个新数组中,但这没有起到作用:

  • 问题内容: 我目前正在制作一个.properties文件,该文件需要加载并转换为数组。但是每个属性键的存在范围可能是0-25。我尝试了一些实现,但我只是坚持这样做。有人有主意吗? 我将把文件名/过期对组合成一个数据对象,作为每个父属性元素的数组的一部分,例如 属性文件的格式可以更改,我愿意接受。 问题答案: 要么定义一个不会成为潜在值的定界符,要么学习使用XML。 如果您仍然坚持使用属性,请使用一

  • 问题: 我使用 pinia 进行状态管理,写法大概如下,由于我修改的是数组中某个对象下的对象的属性,数组更新后,页面无法重新渲染。 当我点击按钮修改元素的 x,y,width,height 某个样式值的时候,layerList 中对应的元素的下的style对象的下属性值也会更新,由于页面是根据这个对象来渲染内联样式的, style 在手动更新后一直无法更新,想请教下各位大佬这是什么原因? 数组 l

  • 栈方法 JavaScript数组也提供了一种 让 数组的行为 像其它数据结构的方法,数组也可以像栈一样,栈是一种 限制插入和删除的数据结构, 栈是一种后进先出的数据结构,最新添加的内容最早移除。 栈中的操作分别是插入和移除,只发生在栈的顶部,push()方法(插入)和pop()方法(移除)。 push()方法可以接收任意多的参数,从末尾插入数据,把它们逐个添加个数组的末尾,并返回修改后数组的 长度

  • 有一个名为的类。 并且我有一个对象的数组。我现在需要的是将该数组中所有对象的s提取到一个新数组中。 我也发现了这个类似的问题。但是它是在Objective-C中的,所以它使用来实现这一点。 我怎么能在斯威夫特做到这一点呢?

  • 问题内容: 通过多个属性对数组中的元素进行分组最符合我的问题,因为它确实通过数组中的多个键对对象进行了分组。问题是此解决方案无法汇总属性值,然后删除重复项,而是将所有重复项嵌套在二维数组中。 预期行为 我有一个对象数组,必须按和进行分组。 这个数组中的对象被视为重复仅当其和是相同的。如果它们是,我想分别总结它们的和值,然后删除重复项。 因此,在这个例子的结果阵列可以仅含有四种组合:,,, 问题 我