最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript數組中相同的元素進行分組(數據聚合)groupBy函數詳解

 更新時間:2023年12月19日 11:54:49   作者:我是夜闌的狗  
今天在打算從js端時序數據庫TSDB中,按相同的類型的數據排在一起,并且取同一時間段最新的數據,經過查詢這種思想叫做數據聚合,就是返回的數據要根據一個屬性來做計算,這篇文章主要介紹了JavaScript數組中相同的元素進行分組(數據聚合)?groupBy函數,需要的朋友可以參考下

前言

  今天在打算從js端時序數據庫TSDB中,按相同的類型的數據排在一起,并且取同一時間段最新的數據,經過查詢這種思想叫做數據聚合,就是返回的數據要根據一個屬性來做計算。

一、數據聚合

1.groupBy()函數

  聚合用groupBy這個函數,它傳兩個形參一為對象數組,二為匿名函數(該函數功能:返回對象的某個指定屬性的屬性值并存放在數組中)

  groupBy: function(array, func){
    var groups = {};
    array.forEach(function(element){
      var group = JSON.stringify(func(element));
      groups[group] = groups[group] || []; //第一次執(zhí)行為空數組
      //groups[group] = [] //這樣寫就會覆蓋之前的數據,視情況而用
      groups[group].push([element,group]);//這里可以單獨傳element,本人是需要用到group才需要進行push
    });
    return Object.keys(groups).map(function(group){
      return groups[group];
    });
  },

  這里返回的是數組,需要返回key所對應的數組可以

    return Object.keys(groups).map(function(group){
      return groups[group];
    });

  Object.keys(groups)是取出groups對象中的所有key,然后遍歷一個個key組成的新數組,返回分好了組的二維數組

  • .groupBy函數內,先創(chuàng)建一個空對象;
  • 然后forEach遍歷對象數組,遍歷時要執(zhí)行的函數中只有一個形參element(數組中的每個元素);
  • 由于下面函數調用是想用name來分組,因此let group = JSON.stringify( func(element) ),相當于先獲取到數組中的想要用來排序的屬性(這里我用返回的new Date(item.timestamp * 1000).getHours(),就是時間戳轉換出的小時)對應的屬性值并放入數組中,然后再將屬性值轉換為json字符串;
  • groups[group] = groups[group] || [],在js中對象也是關聯數組,因此這里相當于做了兩件事,一是把group作為groups的key,二是將對應的value初始化,第一次執(zhí)行為空數組,循環(huán)執(zhí)行時找到相同的name時保持不變;
  • groups[group] = groups[group] || [],這里也可以寫成groups[group] = [],這樣的話每次push進去的數據就會覆蓋之前的數據,從而達到每次都能獲取同一時間段內的最新數據。
  • groups[group].push([element,group]),這句相當于把list中每個對象壓入數組中作為value;

2.sortData()函數

  寫好groupBy函數后就可以調用進行排序了:

  sortData: function(Data){
    var sorted = this.groupBy(Data, function(item){
      return new Date(item.timestamp * 1000).getHours(); // 返回需要分組的對象
      // return item.name; // 返回需要分組的對象
    });
    return sorted;
  },

  這里的return可以返回數組中參數進行比較,比如item中name屬性。item是groupBy函數func(element)中的element

二、ECS6箭頭函數寫法

  上面是ECS5的寫法,到了ECS6之后JS就引入箭頭函數,下面是ECS6含箭頭函數的寫法。

1.sortClass()函數

sortClass(Data){
	const groupBy = (array, func) => {
		let groups = {};
		array.forEach((element)=>{
			let group = JSON.stringify(func(element));
			groups[group] = groups[group] || [];
			groups[group].push(element);
		});
		return Object.keys(groups).map((group) =>{
			return groups[group];
		})
	};
	const sorted = groupBy(Data, (item) =>{
		return item.name;
	})
	return sorted;
}

2.運行結果

  這就是運行sortClass(res.query)之后得到的結果,這里本人是timestamp時間戳來進行排序,而紅框中的數據就是push[element,group]中的group。

三、按需聚合(結合實際使用)

  上面是對數據庫中數據聚合得到是數組每個key對于都是當前最新的值(只有一個),如果這里要求要保留每個key都對于兩個最新的值,則需要對groupBy函數進行改動一下了。

1.groupBy()函數

  /**
   * author: CSH
   * 函數功能:給定參數對數組進行分組并排序
   * @param {Object} array [需要排序的數組]
   * @param {Object} func [該函數參數用于返回用于分組排序的對象]
   */
  groupBy: function(array, func){
    var groups = {};
    array.forEach(function(element){
      var group = JSON.stringify(func(element));
      groups[group] = groups[group] || []; //第一次執(zhí)行為空數組
      // groups[group] = [];  // 這樣就能得到當前小時時間段內最新的數據
      groups[group].push([element,group]);
      groups[group].length >= 3 ? groups[group].shift() : null; // 只保留當前數組最新兩組數據
    });
    return Object.keys(groups).map(function(group){
      return groups[group];
    });
  },

  在js中對數組只保留最新兩項數據需要用到JS中數組里的 shift()方法 (位移元素)了,位移與彈出等同,但處理首個元素而不是最后一個。shift() 方法會刪除首個數組元素,并把所有其他元素“位移”到更低的索引了(類似于隊列一樣)。使用該方法就可以保證數組內的元素都是最新兩項。

2.sortData()函數(無改動)

  /**
   * author: CSH
   * 函數功能:給定數組,并返回需要分組的對象,然后根據該對象進行分組排序返回新的數組 
   * @param {Object} sortData [需要數據聚合的數組]
   */
  sortClass: function(sortData){
    var sorted = this.groupBy(sortData, function(item){
      return new Date(item.timestamp * 1000).getHours(); // 返回需要分組的對象
      // return item.name; // 返回需要分組的對象
    });
    return sorted;
  },

  對groupBy()函數進行改動之后,在用sortData進行調用返回就能得到想要的數據了。

總結

  以上就是今天要講的內容,本文僅僅簡單介紹了JS數據聚合的方法,ECS5和ECS6分別都有不同的寫法。

到此這篇關于JavaScript數組中相同的元素進行分組(數據聚合) groupBy函數的文章就介紹到這了,更多相關js數組分組groupBy函數內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

旬邑县| 太谷县| 兴安盟| 汝城县| 金昌市| 奈曼旗| 格尔木市| 曲阜市| 遵义市| 中超| 无极县| 榆树市| 达尔| 兴安盟| 麦盖提县| 汤原县| 榆林市| 柯坪县| 齐河县| 杂多县| 宜都市| 图们市| 屏山县| 托里县| 临颍县| 应用必备| 梧州市| 女性| 江永县| 沙河市| 七台河市| 太原市| 缙云县| 富民县| 新乡市| 台江县| 曲沃县| 盱眙县| 大余县| 尤溪县| 鹿邑县|