JavaScript 中計數重複項和聚合物件陣列


給定的問題要求計算陣列元素的重複項,然後在一個新陣列中聚合物件。

理解問題

問題陳述是要從陣列中識別重複元素,並建立一個包含這些物件及其計數的單個數組。為了解決這個問題,我們將使用迴圈的幫助來使用蠻力技術。

什麼是物件陣列的聚合?

陣列中的聚合是指將多個物件組合到一個新的輸出陣列中。我們必須檢查物件的聚合是否與提到的陣列的現有元素相容且相等。

問題陳述可以透過以下給出的輸出看到

輸入

const details = [ 
  { skill: 'Python', user: 'Preet' }, 
  { skill: 'Javascript', user: 'Shreya' }, 
  { skill: 'Javascript', user: 'Kajal' }, 
  { skill: 'Java', user: 'Preet' }, 
  { skill: 'Javascript', user: 'Preet' }, 
  { skill: 'HTML and Css', user: 'Happy' } 
];

輸出

[
{ "skill": "Python",
  "user": [
   "Preet",
   "Happy"
  ]
},
{
  "skill": "Javascript",
  "user": [
   "Shreya",
   "Kajal",
   "Preet"
  ]
},
{
  "skill": "Java",
  "user": [
   "Preet"
  ]
},
{
  "skill": "HTML and Css",
  "user": [
   "Happy"
  ]
}
]

演算法

步驟 1:物件陣列中給出的輸入是重複資料和相同型別的混合,在我們的示例中,name 和 type 物件具有重複的值。因此,要將它們聚合到另一個數組中,並帶有它們的計數值。為了解決這個問題,在其中給出了三個引數的函式宣告,並將它們命名為 data、pCount(屬性計數)和 pGroup(要分組的屬性)。

步驟 2:宣告一個計數變數來計算資料中物件值的出現次數。

步驟 3:現在我們定義多個迴圈來找出具有相同屬性和值的屬性。在我們的示例中,我們有兩個物件,即 name 和 type。因此,我初始化了兩個迴圈來分離屬性並將它們放入不同的陣列中,以及一個迴圈來計算相同型別的物件。

步驟 4:在透過所有條件後,將得到結果的新陣列,我們可以看到包含所有多個數組及其不同資料值的輸出。

示例

// Declaration of data 
const data = [
  { name: 'Orange', type: 'fruit' },
  { name: 'Orange', type: 'fruit' },
  { name: 'Pineapple', type: 'fruit' },
  { name: 'Pineapple', type: 'fruit' },
  { name: 'Potato', type: 'vegetable' },
  { name: 'Tomato', type: 'vegetable' },
  { name: 'spinach', type: 'vegetable' },
  { name: 'spinach', type: 'vegetable' }
];
// declaration of function with three arguments
function countCollect(data, pCount, pGroup) {
  var count = {};
  for (let obj of data) {
	let pValue = obj[pCount];
	if (pValue in count) {
     count[pValue]++;
	} else {
  	count[pValue] = 1;
	}
  }
  let result = {};
  for (let obj of data) {
	let gValue = obj[pGroup];
	if (gValue in result) {
     result[gValue].push(obj);
	} else {
     result[gValue] = [obj];
	}
  }
  for (let pValue in count) {
	result[pValue] = {
  	count: count[pValue]
	};
  }
  return result;
}
let result = countCollect(data, 'name', 'type');
console.log(result);

輸出

{
  fruit: [
   { name: 'Orange', type: 'fruit' },
   { name: 'Orange', type: 'fruit' },
   { name: 'Pineapple', type: 'fruit' },
   { name: 'Pineapple', type: 'fruit' }
  ],
  vegetable: [
   { name: 'Potato', type: 'vegetable' },
   { name: 'Tomato', type: 'vegetable' },
   { name: 'spinach', type: 'vegetable' },
   { name: 'spinach', type: 'vegetable' }
  ],
  Orange: { count: 2 },
  Pineapple: { count: 2 },
  Potato: { count: 1 },
  Tomato: { count: 1 },
  spinach: { count: 2 }
}

在上面的輸出中,我們可以看到一個包含不同型別資料的陣列。輸出的初始塊顯示水果,輸出的第二個塊顯示蔬菜及其名稱和型別。輸出的最後一個塊顯示水果和蔬菜的計數。

複雜度

執行此演算法所需的時間為 n 平方時間的大 O。因為該演算法使用兩個迴圈來獲取結果。空間複雜度將根據陣列的長度計算,以將所有元素儲存在記憶體中。因此,藉助複雜度,我們可以分析問題的效率。

結論

正如我們所看到的,給定問題的簡單性。要解決任何問題,我們需要遵循某些步驟並進行邏輯思考。時間複雜度和空間複雜度是衡量演算法效率的兩個指標。上述問題採用不同的方法來計算時間空間複雜度。

更新於: 2023年8月18日

2K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.