亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 JavaScript 中使用 Map、Reduce 和 Filter 從嵌套數組打印

在 JavaScript 中使用 Map、Reduce 和 Filter 從嵌套數組打印

哈士奇WWW 2023-11-11 21:43:56
最終目的是為以下數組中的每個名稱獲取一個。(類似于下面代碼片段底部注釋掉的行)如果有同名,則只取數量最多的,如果有重復,則只取版本較高的。我嘗試使用map、reduce的組合。請幫我解決這個問題。//Original arrayvar arr = [  {'name': 'b', 'version': '103', 'count': 10},   {'name': 'a', 'version': '0.1b', 'count': 73},   {'name': 'b', 'version': '109', 'count': 67},   {'name': 'a', 'version': '1.0.3', 'count': 100},   {'name': 'a', 'version': '2.1.0', 'count': 100},   {'name': 'c', 'version': 'a103', 'count': 30},   {'name': 'c', 'version': 'a111', 'count': 100}];//expected console output// { name: 'a', version: '2.1.0', count: 100 }// { name: 'b', version: '109', count: 67 }// { name: 'c', version: 'a111', count: 100 }首先,作為該過程的“一部分”,我嘗試從數組中獲取“a”。var filteredArr = arr.filter(item => item.name === 'a');var m = Math.max(...(filteredArr.map(({count}) => count))),  maxes = arr.map(({count}) => count).reduce((p,c,i,a) => c ==  m ? p.concat(i) : p,[]);console.log(maxes);我期望從上面得到 [3, 4],但它打印出 [3, 4, 6]。=====附加問題:我該如何處理這另一個原始的預期。//Another original array.var arr2 = [   { name: 'a', version: '0.1', count: 1 },  { name: 'b', version: '216', count: 1 },  { name: 'b', version: '209', count: 1 },  { name: 'b', version: '216', count: 1 },  { name: 'b', version: '216', count: 1 },  { name: 'b', version: '213', count: 1 },  { name: 'b', version: '213', count: 1 },  { name: 'b', version: '209', count: 1 },  { name: 'b', version: '216', count: 1 },  { name: 'b', version: '216', count: 1 }];//expected output// { name: 'a', version: '0.1', count: 1 },// { name: 'b', version: '216', count: 5 },// { name: 'b', version: '209', count: 2 },// { name: 'b', version: '213', count: 2 }
查看完整描述

2 回答

?
弒天下

TA貢獻1818條經驗 獲得超8個贊

您可以Array#reduce與對象一起使用來存儲每個名稱的對象。


var arr = [

  {'name': 'b', 'version': '103', 'count': 10}, 

  {'name': 'a', 'version': '0.1b', 'count': 73}, 

  {'name': 'b', 'version': '109', 'count': 67}, 

  {'name': 'a', 'version': '1.0.3', 'count': 100}, 

  {'name': 'a', 'version': '2.1.0', 'count': 100}, 

  {'name': 'c', 'version': 'a103', 'count': 30}, 

  {'name': 'c', 'version': 'a111', 'count': 100}

];

const res = Object.values(arr.reduce((acc,{name, version, count})=>{

  if(!acc[name] || acc[name] && 

          (acc[name].count < count 

           || acc[name].count === count && acc[name].version < version)){

    acc[name] = {name, version, count};

  }

  return acc;

}, {}));

console.log(res);


查看完整回答
反對 回復 2023-11-11
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

看來您在第二種情況下想要做的是聚合count具有相同name和的條目的屬性version(類似于數據庫中的COUNT+GROUP BY查詢SQL)。


在這種情況下,您可以首先在第一級計算dictionary_res索引,然后在第二級計算索引:nameversion


dictionary_res = arr2.reduce((acc, { name, version, count }) => {

  if (!acc[name] || (acc[name] && !acc[name][version])) {

    acc[name] = acc[name] || {}

    acc[name][version] = { count: count }

  } else {

    acc[name][version]['count'] = acc[name][version]['count'] + count

  }

  return acc

}, {})

dictionary_res產生一個非常接近您想要的值:


{

  a: { '0.1': { count: 1 } },

  b:

  { '209': { count: 2 }, '213': { count: 2 }, '216': { count: 5 } }

}

但是,您仍然需要將其轉換為數組才能完全實現您想要的:


array_res = Object.keys(dictionary_res).reduce((acc, name) => {

  Object.keys(dictionary_res[name]).forEach((version) => (

    acc.push({ name, version, count: dictionary_res[name][version]['count'] })

  ))

  return acc

}, [])

array_res現在產生預期值:


[ { name: 'a', version: '0.1', count: 1 },

  { name: 'b', version: '209', count: 2 },

  { name: 'b', version: '213', count: 2 },

  { name: 'b', version: '216', count: 5 } ]


查看完整回答
反對 回復 2023-11-11
  • 2 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號