簡體   English   中英

使用 map 從嵌套數組打印,在 javascript 中減少和過濾

[英]Print from nested array using map, reduce and filter in javascript

最終目的是為以下數組中的每個名稱獲取一個。 (就像下面片段底部的注釋行)

如果有相同的名字,只有最大的一個,如果有重復的,只有一個更高版本的。

我嘗試使用map的組合,減少。 請幫我解決這個問題。

//Original array
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}
];

//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 }

您可以使用Array#reduce和 object 來存儲每個名稱的 object。

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

在第二種情況下,您似乎想要為具有相同nameversion的條目聚合count屬性(類似於SQL數據庫中的COUNT + GROUP BY查詢)。

在這種情況下,您可以首先在第一級計算按name索引的dictionary_res ,在第二級按version索引:

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 } ]

暫無
暫無

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

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