簡體   English   中英

如何將javascript數組對象中的值與特定搜索ID相加?

[英]How to sum value in javascript array object form specific search id?

我有如下 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 中。 感謝所有的答案。

您可以使用 filter 和 reduce 的組合來獲得您想要的結果:

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

用法:

const sumOf1 = sumOfId(1); //85

閱讀材料:

數組.prototype.filter

Array.prototype.reduce

一種使用傳統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);

運行示例

JS 菜鳥在這里......我想像這樣的東西也應該在這里:-)

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

您可以使用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);

reduce其擁有的所有物品id1通過filter荷蘭國際集團的出:

 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 id = 1; var sum = array.filter(({ id }) => id == 1).reduce((acc, { val }) => acc + val, 0); console.log(sum); 

您是否需要ES5版本:

 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 id = 1; var sum = array.filter(function(i) { return i.id == 1}).reduce(function(acc, curr) { return acc + curr.val}, 0); console.log(sum); 

您可以在數組上循環並檢查 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);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

您可以使用求和函數從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>

使用Array#reduceMap您可以像這樣獲得每個 id 的總和。 這也使用解構來更快地訪問屬性。

 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);

這是另一種選擇,引入一個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) );

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM