JavaScript陣列方法綜合應用案例
業務背景:
專案上有一個價格庫的概念,對應於某個地區的某個時間段。即:在某年的某個季度或者月份,專案公司會對各個地區建立該地區的人工、材料、機械的價格庫。
呈現檢視如下:
資料庫設計
對於上面的業務,由於地區和價格期數是作為字典維護的,有獨立的前端模組進行維護,所以需要獨立建表。
同時,出於效率方面的考慮,未採用物理外來鍵,使用了邏輯外來鍵,由程式全權保證業務邏輯的正確性和完整性。
最終的表結構如下圖所示:
後臺介面
專案採用前後端分離的結構,後臺提供CRUD介面,前臺進行邏輯呈現。後端採用SpringBoot構建微服務體系,前臺為使用vue框架的SPA應用。
後臺提供Restful API介面,並通過Swagger提供前端開發人員進行查詢和聯調的介面文件介面及聯調工具。
地區介面
價格期數介面
價格庫介面
價格庫中,除了基礎的增刪改查介面之外,還有帶字典獲取列表的介面(即一個請求同時獲取到價格庫及地區字典、價格期數字典);另外,還有按照價格期數執行使能切換的介面。
前端呈現實現
前端呈現的一個複雜之處在於:
1. 將原本的無層級記錄列表呈現為帶層級的邏輯檢視;
2. 一級記錄為從原本記錄中構造出來的交集;
3. 二級記錄需要與一級記錄構建層級關係;
4. 存在過濾狀態(即按照關鍵字進行過濾的狀態);
為此,作如下的處理:
1 三級請求獲取資料(鑑於帶字典請求資料的介面與目前的前端公共介面不相容,因此暫時採用三級序列請求的方式):
function(currentItemId) {
var vueObj = this;
// 一級請求,請求價格期數資料
periodModel().getTableDatas(function(items) {
vueObj.periods = items;
items.forEach(function(item) {
vueObj.periodMap[item.id] = item.description;
});
// 二級請求,請求地區資料
regionModel().getTableDatas(function(items) {
vueObj.regions = items;
items.forEach(function(item) {
vueObj.regionMap[item.id] = item.description;
});
// 三級請求,請求價格庫資料
resPriceDBModel().getTableDatas(function(items) {
vueObj.moving = false;
vueObj.doFormatDisplayData(items);
// 資料獲取完成並進行修飾構造後,通過handsonTable進行呈現
vueObj.$refs.table.$emit('show-grid', vueObj.tableData(), vueObj.fieldList, vueObj.getEditStyle, true, vueObj.getAlignment, 'all');
vueObj.setCurrentRow(currentItemId);
}, function(errMsg) {
vueObj.moving = false;
vueObj.$message({message: errMsg, type: 'error'});
});
}, function(errMsg) {
vueObj.moving = false;
vueObj.$message({message: errMsg, type: 'error'});
});
}, function(errMsg) {
vueObj.moving = false;
vueObj.$message({message: errMsg, type: 'error'});
});
}
2 其中,最關鍵的方式是doFormatDisplayData,該方法構造出最終呈現的資料檢視;
演算法邏輯為:
① 遍歷獲取到的價格庫記錄陣列,按照需要填充前臺呈現所需資料(採用陣列的map方法);
② 如果處於過濾狀態,則對構造後的陣列執行過濾處理(採用陣列的filter方法);
③ 對於構造後的陣列執行排序(按照價格期數排序,採用陣列的sort方法);
④ 通過構造後的陣列,提取出一級記錄的map(採用陣列的reduce方法);
⑤ 將構造後的資料填充到handsonTable呈現對應的陣列物件,對於一級記錄直接壓入(採用陣列的push方法);
⑥ 對於二級記錄,則將原資料陣列進行slice處理提取出一級記錄對應的子記錄,然後呼叫forEach方法將各記錄壓入陣列(採用陣列的slice及forEach方法)。
function(items) {
var vueObj = this;
var keyword = vueObj.keyword;
var datas = [];
if (vueObj.inSearch) {
datas = items.map(vueObj.makeupResPriceDB).filter(function(item) {
return (item.period && item.period.indexOf(keyword) >= 0) ||
(item.region && item.region.indexOf(keyword) >= 0) ||
(item.auditor && item.auditor.indexOf(keyword) >= 0);
}).sort(vueObj.doCompareResPriceDB);
} else {
datas = items.map(vueObj.makeupResPriceDB).sort(vueObj.doCompareResPriceDB);
}
var periodMap = datas.reduce(function (prevResult, currItem) {
if (prevResult.has(currItem.period_id)) {
prevResult.get(currItem.period_id).childCount += 1;
} else {
var periodObj = vueObj.makeupParentPeriodRec(currItem.period_id, currItem.enabled);
prevResult.set(currItem.period_id, periodObj);
}
return prevResult;
}, new Map());
dataStore[vueObj._uid].tableData = [];
var startIndex = 0;
for (var value of periodMap.values()) {
dataStore[vueObj._uid].tableData.push(value);
datas.slice(startIndex, startIndex + value.childCount).forEach(function(data) {
dataStore[vueObj._uid].tableData.push(data);
});
startIndex += value.childCount;
}
}
如上可知,該部分檢視的構造邏輯還是有一些複雜的,其中綜合運用了陣列的各個方法,也算是對於JS陣列的一次學習應用了。
JS陣列方法總結
XMind總結陣列方法,如下三張圖:
相關推薦
JavaScript陣列方法綜合應用案例
業務背景: 專案上有一個價格庫的概念,對應於某個地區的某個時間段。即:在某年的某個季度或者月份,專案公司會對各個地區建立該地區的人工、材料、機械的價格庫。 呈現檢視如下: 資料庫設計 對於上面的業務,由於地區和價格期數是作為字典維護的,有獨立的前端模
很經典的綜合應用案例
hsrp備份技術 vlan技術 trunk很經典的綜合應用案例
Squid代理服務器綜合應用案例
linu 正向代理 p地址 概念 cache 訪問 密碼文件 客戶機 var squid代理服務器 squid是一種用來緩存Internet數據的軟件。接受來自客戶機需要下載的目標的請求並適當的處理這些請求。也就是說,如果一個客戶端想要打開默認網站,它請求squid為它取
JavaScript 陣列方法總結
內建方法Array from 將其他遍歷物件轉換為陣列 isArray判斷是否陣列 of建立陣列 原型方法Arrayprot
JavaScript陣列方法及陣列檢測方法
方法總覽 concat 連線兩個或者更多陣列,並返回結果 var array = [1,3,4]; var array2 = [2, 4, 6]; array.concat(array2); //
JavaScript陣列方法總結
一.建立陣列的方式 1.使用Array建構函式 var color=new Array(); 注意:括號裡面引數可以有引數,若為一個數字,表示該陣列的長度,如果為多個數字或者一個(多個)非數字表示的是傳遞陣列中應該包含的值。 2.使用陣列字面量 var co
Hive SQL 綜合應用案例實戰及多項效能指標深入講解-DW商業環境實戰
版權宣告:本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。QQ郵箱地址:[email protected],如有任何技術交流,可隨時聯絡。 1:order by, sort by,
JavaScript 陣列方法集合及示例!
陣列基礎知識 你應該知道陣列是什麼,但以下是一個簡單的概述:陣列就像放東西的盒子,你可以放進東西(新增),拿出東西(刪除)或者擺放它們的位置及拿出我們想要的東西。 陣列的建立 以下是建立陣列的幾種方式: 陣列的新增和刪除 常用的方法 對常見場景的概述以及用於每個場
javascript陣列方法
一.陣列物件作用:使用單獨的變數名來儲存一系列的值。JavaScript中建立陣列有兩種方式(一)使用 Array 建構函式:var arr1 = new Array(); //建立一個空陣列var arr2 = new Array(20); // 建立一個包含20項的陣列v
JavaScript陣列方法總結篇
方法在陣列的尾部新增一個或多個元素,並返回陣列的長度 引數: item1, item2, …, itemX ,要新增到陣列末尾的元素 let arr = [1,2,3]; let length = arr.push('末尾1','末尾2'); // 返回陣列長度 con
JavaScript 陣列方法
ECMAScript 3在Array.prototype中定義了一些很有用的運算元組的函式: Array.join()方法將陣列中所有元素轉化為字串並連線在一起: var a = [1,2,3]; // 建立一個包含三個
JavaScript 陣列方法大全
陣列在筆試題中出現的概率最高的型別之一,JavaScript中的陣列與其他語言中的陣列有些區別,為了方便以後檢視陣列的方法,現將對陣列的操作方法進行彙總整理。 陣列建立 JavaScript中建立陣列有兩種方式,第一種是使用 Array 建構函式:
JavaScript陣列方法詳解
JavaScript陣列方法詳解 JavaScript中陣列的方法種類眾多,在ES3-ES7不同版本時期都有新方法;並且陣列的方法還有原型方法和從object繼承的方法,這裡我們只介紹陣列在每個版本中原型上的方法,本文舉例介紹了從ES3到ES7幾乎所有的陣列方法。這大概是最全的陣列方法詳解了。希望讀者能從中有
day27—JavaScript實現定時器及其應用案例
scrip tin 定時 定時器對象 延遲 day 方法 fun value 轉行學開發,代碼100天——2018-04-12 JavaScript中定時器有兩種,分別是setInterval和setTimeout;其用法如下: 開啟: setTimeout("fun
JavaScript 陣列常用方法
有一天被問到了一個題,感覺很有意思,如下: new Array(6) new Array(6, 6) //上訴兩行程式碼,分別建立了什麼? 檢測陣列 var arr = []; arr instanceof Array Array.isArray(a
javascript 陣列 常用方法
前言 學學忘忘 閒來做個筆記 整理下陣列常用方法。 Array 陣列常用方法 建立陣列的基本方式有兩種 1.第一種是使用Array建構函式, var arr = new Array()
原聲JS中indexOf()方法在陣列中的應用一
定義和用法 indexOf() 方法可返回某個指定的字串值在字串中首次出現的位置。 提示和註釋 註釋:indexOf() 方法對大小寫敏感! 註釋:如果要檢索的字串值沒有出現,則該方法返回 -1。 註釋:字元位置是從 0 開
javascript常用陣列方法
1、join()方法: Array.join()方法將陣列中所以元素都轉化為字串連結在一起,返回最後生成的字串。也可以指定可選的字串在生成的字串中來分隔陣列的各個元素。如果不指定分隔符,預設使用逗號。案例如下: ? 1 2 3 4 va
JavaScript陣列常用方法2
1.forEach()方法列出每個元素 <button onclick="numbers.forEach(myFunction)">點我</button> <p id="demo"></p> <script> demoP = do
JavaScript陣列去重的四種方法
今天,剛剛參加了公司的筆試,關於陣列去重,後來簡單總結了幾種方法,希共勉,為我打call....... es5四種方式: 方式一: Array.prototype.unique1 = function() { // 1. 定義陣列 var temp = []; // 2. 遍歷當前陣列 f