【问题标题】:How to sum value in javascript array object form specific search id?如何在特定搜索 id 的 javascript 数组对象中求和值?
【发布时间】:2021-04-16 05:06:44
【问题描述】:

我有如下的 javascript 数组对象。我的需要是根据数组对象中的 seach id 对值求和。

var array = [
{ id: 1, val: 10 }, 
{ id: 2, val: 25 }, 
{ id: 3, val: 20 }, 
{ id: 1, val: 30 }, 
{ id: 1, val: 25 }, 
{ id: 2, val: 10 }, 
{ id: 1, val: 20 }
],

例如 id 1 的值总和是 10 + 30 + 25 + 20 = 85 ,它可能是链接 linq 但我不确定在 javascript 中。谢谢大家的回答。

【问题讨论】:

  • 请显示预期输出
  • 例如。我需要在 id=1 处求和值。所以输出必须是 10 + 30 + 25 + 20 = 85

标签: javascript


【解决方案1】:

这里的JS菜鸟......我想这样的东西也应该在这里:-)

let newArray = {}
array.forEach((e) => {
    !newArray[e.id] && (newArray[e.id] = 0);
    newArray[e.id] += e.val;
  });

【讨论】:

    【解决方案2】:

    这是另一种选择,引入Array.prototype.sum 助手:

    Array.prototype.sum = function (init = 0, fn = obj => obj) {
        if (typeof init === 'function') {
            fn = init;
            init = 0;
        }
    
        return this.reduce(
            (acc, ...fnArgs) => acc + fn(...fnArgs), 
            init
        );
    };
    
    // .sum usage examples
    console.log(
        // sum simple values
        [1, 2, 3].sum(),
        // sum simple values with initial value
        [1, 2, 3].sum(10),
        // sum objects
        [{ a: 1 }, { a: 2 }, { a: 3 }].sum(obj => obj.a),
        // sum objects with initial value
        [{ a: 1 }, { a: 2 }, { a: 3 }].sum(10, obj => obj.a),
        // sum custom combinations
        [{ amount: 1, price: 2 }, { amount: 3, price: 4 }]
            .sum(product => product.amount * product.price)
    );
    
    var array = [{ id: 1, val: 10 }, { id: 2, val: 25 }, { id: 3, val: 20 }, { id: 1, val: 30 }, { id: 1, val: 25 }, { id: 2, val: 10 }, { id: 1, val: 20 }];
    
    // solutions
    console.log(
        array.filter(obj => obj.id === 1).sum(obj => obj.val),
        array.filter(({id}) => id === 1).sum(({val}) => val),
        array.sum(({id, val}) => id === 1 ? val : 0)
    );

    参考:

    【讨论】:

      【解决方案3】:

      你可以结合使用 filter 和 reduce 来得到你想要的结果:

      sumOfId = (id) => array.filter(i => i.id === id).reduce((a, b) => a + b.val, 0);
      

      用法:

      const sumOf1 = sumOfId(1); //85
      

      阅读材料:

      Array.prototype.filter

      Array.prototype.reduce

      【讨论】:

        【解决方案4】:

        您可以使用求和函数从linq.js 中获取GroupBy

        var array = [{ id: 1, val: 10 }, { id: 2, val: 25 }, { id: 3, val: 20 }, { id: 1, val: 30 }, { id: 1, val: 25 }, { id: 2, val: 10 }, { id: 1, val: 20 }],
            result = Enumerable
                .From(array)
                .GroupBy(null, null, "{ id: $.id, sum: $$.Sum('$.val') }", "$.id")
                .ToArray();
        
        console.log(result);
        .as-console-wrapper { max-height: 100% !important; top: 0; }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.js"></script>

        【讨论】:

        • 谢谢你的好意。
        【解决方案5】:

        使用 Array#reduceMap 你可以像这样得到每个 id 的总和。这也使用destructuring 来更快地访问属性。

        const data=[{id:1,val:10},{id:2,val:25},{id:3,val:20},{id:1,val:30},{id:1,val:25},{id:2,val:10},{id:1,val:20}];
        
        const res = data.reduce((a,{id,val})=>{
          return a.set(id, (a.get(id)||0) + val);
        }, new Map())
        
        console.log(res.get(1));
        console.log(res.get(2));

        如果你想输出所有的和,那么你需要使用Array#from

        const data=[{id:1,val:10},{id:2,val:25},{id:3,val:20},{id:1,val:30},{id:1,val:25},{id:2,val:10},{id:1,val:20}];
        
        const res = Array.from(
          data.reduce((a,{id,val})=>{
            return a.set(id, (a.get(id)||0) + val);
          }, new Map())
        );
        
        console.log(res);

        如果格式应该和你原来的结构类似,你需要在之后添加一个Array#map来转换它。

        const data=[{id:1,val:10},{id:2,val:25},{id:3,val:20},{id:1,val:30},{id:1,val:25},{id:2,val:10},{id:1,val:20}];
        
        const res = Array.from(
          data.reduce((a,{id,val})=>{
            return a.set(id, (a.get(id)||0) + val);
          }, new Map())
        ).map(([id,sum])=>({id,sum}));
        
        console.log(res);

        【讨论】:

        • 谢谢你的好意。
        【解决方案6】:

        一种使用传统 for 循环的方法

        var array = [
          { id: 1, val: 10 }, 
          { id: 2, val: 25 }, 
          { id: 3, val: 20 }, 
          { id: 1, val: 30 }, 
          { id: 1, val: 25 }, 
          { id: 2, val: 10 }, 
          { id: 1, val: 20 }
        ];
        
        var sums = {};
        for (var i = 0; i < array.length; i++) {
          var obj = array[i];
          sums[obj.id] = sums[obj.id] === undefined ? 0 : sums[obj.id];
          sums[obj.id] += parseInt(obj.val);
        }
        
        console.log(sums);
        

        running example

        【讨论】:

        • 谢谢你的好意。
        【解决方案7】:

        您可以在数组上循环并检查 id。

        var array = [
          { id: 1, val: 10 }, 
          { id: 2, val: 25 }, 
          { id: 3, val: 20 }, 
          { id: 1, val: 30 }, 
          { id: 1, val: 25 }, 
          { id: 2, val: 10 }, 
          { id: 1, val: 20 }
        ];
        
        var sum = 0;
        var id = 1;
        
        $.each(array, function(index, object){
          if (object.id == id) {
            sum += object.val;
          }
        });
        
        console.log(sum);
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

        【讨论】:

        • 谢谢你的好意。
        【解决方案8】:

        您可以使用reduce()findIndex()

        var array = [
        { id: 1, val: 10 }, 
        { id: 2, val: 25 }, 
        { id: 3, val: 20 }, 
        { id: 1, val: 30 }, 
        { id: 1, val: 25 }, 
        { id: 2, val: 10 }, 
        { id: 1, val: 20 }
        ];
        let res = array.reduce((ac,a) => {
          let ind = ac.findIndex(x => x.id === a.id);
          ind === -1 ? ac.push(a) : ac[ind].val += a.val;
          return ac;
        },[])
        console.log(res);

        【讨论】:

        • 谢谢你的好意。
        猜你喜欢
        • 2017-07-22
        • 2023-04-10
        • 2021-12-12
        • 2011-05-06
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多