本篇內(nèi)容主要講解“JavaScript數(shù)據(jù)處理的常見(jiàn)問(wèn)題如何解決”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“JavaScript數(shù)據(jù)處理的常見(jiàn)問(wèn)題如何解決”吧!
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的宣漢網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

場(chǎng)景:這是一個(gè)后臺(tái)管理系統(tǒng)——字典管理模塊,包含了數(shù)據(jù)字典的增刪改查4個(gè)操作。那么應(yīng)對(duì)這4個(gè)操作,我們的解決方案是什么呢,請(qǐng)您接著往下看

arr.push 從數(shù)組后面推入一個(gè)元素或多個(gè)元素
var arr = [1,2,3]; // 返回:修改后數(shù)組的長(zhǎng)度 arr.push(4,5,6); console.log(arr) //輸出結(jié)果 arr=[1,2,3,4,5,6]
arr.unshift 從數(shù)組前面添加一個(gè)或多個(gè)元素
var arr = [1,2,3]; // 返回:修改后數(shù)組的長(zhǎng)度 arr.unshift(4,5,6); console.log(arr) //輸出結(jié)果 arr=[4,5,6,1,2,3]
arr.shift 用于將數(shù)組的第一個(gè)元素移除
// 數(shù)組的shift方法用于將數(shù)組的第一個(gè)元素移除 var arr = [1,2,3]; // 返回 被刪除的元素; arr.shift(); //輸出結(jié)果 arr=[2,3]
arr.pop 刪除數(shù)組最后一個(gè)元素;
// 數(shù)組的pop方法用于將數(shù)組的最后一個(gè)元素移除 var arr = [1,2,3]; // 返回 被刪除的元素; arr.pop(); //輸出結(jié)果 arr = [1,2];
arr.splice:可進(jìn)行數(shù)組任何位置的增刪改
具有刪除、插入,替換三個(gè)作用,該方法返回的是一個(gè)數(shù)組(包含從原數(shù)組中刪除的項(xiàng)(若沒(méi)有刪除項(xiàng)則返回一個(gè)空數(shù)組))
語(yǔ)法
splice(index,howmany,item1,…itemx);
index——必須,整數(shù),規(guī)定添加或者刪除的位置,使用負(fù)數(shù),從數(shù)組尾部規(guī)定位置。
howmany——必須,要?jiǎng)h除的數(shù)量,如果為0,則不刪除項(xiàng)目。
item1,…itemx——可選,向數(shù)組添加的新項(xiàng)目。
1. 刪除 可刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù):要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。 let arr=[1,2,3]; let arr1=arr.splice(1,2);//會(huì)刪除數(shù)組的第2和3個(gè)元素(即2,3) alert(arr);//[1] alert(arr1);//[2,3] 2. 插入 可以向指定位置插入任意數(shù)量的項(xiàng)只需提供3個(gè)參數(shù):起始位置、0(要?jiǎng)h除的項(xiàng)數(shù))、要插入的項(xiàng)。 let arr=[1,2,3]; let arr1=arr.splice(1,0,4,5);//會(huì)從數(shù)組的1位置開(kāi)始插入4,5 alert(arr);//[1,4,5,2,3] alert(arr1);//[] 3. 替換 可以向指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定3個(gè)參數(shù):起始位置、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)(插入的數(shù)量不必與刪除的數(shù)量相等) let arr = [1,2,3]; let arr1=arr.splice(1,1,"red","green");//會(huì)刪除2,然后從2位置插入字符串"red"和"green" alert(arr);//[1,"red","green",3] alert(arr1);//[2]
arr.indexOf:根據(jù)元素查找索引,如果這個(gè)元素在數(shù)組中,返回索引,否則返回-1,找元素在不在數(shù)組內(nèi)部
var arr = [10,20,30] console.log(arr.indexOf(30)); // 2 console.log(arr.indexOf(40)); // -1
arr.findIndex :用于查找滿足條件的第一個(gè)元素的索引,如果沒(méi)有,則返回-1
var arr = [10, 20, 30];
var res1 = arr.findIndex(function (item) {
return item >= 20;
});
// 返回 滿足條件的第一個(gè)元素的的索引
console.log(res1);join 用于將數(shù)組中的多元素以指定分隔符連接成一個(gè)字符串
var arr = ['用戶1','用戶2','用戶3'];
var str = arr.join('|');
console.log(str); //
用戶1|用戶2|用戶3split 字符串的方法:轉(zhuǎn)數(shù)字,后面為分隔的字符
// 這個(gè)方法用于將一個(gè)字符串以指定的符號(hào)分割成數(shù)組
var str = '用戶1|用戶2|用戶3';
var arr = str.split('|');
console.log(arr);
['用戶1','用戶2','用戶3']不得不說(shuō),隨著科技的進(jìn)步硬件的發(fā)展,瀏覽器的計(jì)算性能也隨之提升,接下來(lái)我們會(huì)遇到第二種情況——數(shù)據(jù)的排序操作,也就是需要我們?cè)谇岸藢?shí)現(xiàn)各種排序,那么我們的解決方案又有哪些呢,接著往下看~

var arr = [23,34,3,4,23,44,333,444];
arr.sort(function(a,b){
return a-b;
})
console.log(arr);這里也一并介紹一下常用的幾種排序算法:
var arr = [23,34,3,4,23,44,333,444];
var arrShow = (function insertionSort(array){
if(Object.prototype.toString.call(array).slice(8,-1) ==='Array'){
for (var i = 1; i < array.length; i++) {
var key = array[i];
var j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return array;
}else{
return 'array is not an Array!';
}
})(arr);
console.log(arrShow);//[3, 4, 23, 23, 34, 44, 333, 444]function binaryInsertionSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
for (var i = 1; i < array.length; i++) {
var key = array[i], left = 0, right = i - 1;
while (left <= right) {
var middle = parseInt((left + right) / 2);
if (key < array[middle]) {
right = middle - 1;
} else {
left = middle + 1;
}
}
for (var j = i - 1; j >= left; j--) {
array[j + 1] = array[j];
}
array[left] = key;
}
return array;
} else {
return 'array is not an Array!';
}
}function selectionSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
var len = array.length, temp;
for (var i = 0; i < len - 1; i++) {
var min = array[i];
for (var j = i + 1; j < len; j++) {
if (array[j] < min) {
temp = min;
min = array[j];
array[j] = temp;
}
}
array[i] = min;
}
return array;
} else {
return 'array is not an Array!';
}
}function bubbleSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
var len = array.length, temp;
for (var i = 0; i < len - 1; i++) {
for (var j = len - 1; j >= i; j--) {
if (array[j] < array[j - 1]) {
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
return array;
} else {
return 'array is not an Array!';
}
}//方法一
function quickSort(array, left, right) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array' && typeof left === 'number' && typeof right === 'number') {
if (left < right) {
var x = array[right], i = left - 1, temp;
for (var j = left; j <= right; j++) {
if (array[j] <= x) {
i++;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
};
} else {
return 'array is not an Array or left or right is not a number!';
}
}
var aaa = [3, 5, 2, 9, 1];
quickSort(aaa, 0, aaa.length - 1);
console.log(aaa);
//方法二
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};/*方法說(shuō)明:堆排序
@param array 待排序數(shù)組*/
function heapSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === 'Array') {
//建堆
var heapSize = array.length, temp;
for (var i = Math.floor(heapSize / 2); i >= 0; i--) {
heapify(array, i, heapSize);
}
//堆排序
for (var j = heapSize - 1; j >= 1; j--) {
temp = array[0];
array[0] = array[j];
array[j] = temp;
heapify(array, 0, --heapSize);
}
} else {
return 'array is not an Array!';
}
}
/*方法說(shuō)明:維護(hù)堆的性質(zhì)
@param arr 數(shù)組
@param x 數(shù)組下標(biāo)
@param len 堆大小*/
function heapify(arr, x, len) {
if (Object.prototype.toString.call(arr).slice(8, -1) === 'Array' && typeof x === 'number') {
var l = 2 * x, r = 2 * x + 1, largest = x, temp;
if (l < len && arr[l] > arr[largest]) {
largest = l;
}
if (r < len && arr[r] > arr[largest]) {
largest = r;
}
if (largest != x) {
temp = arr[x];
arr[x] = arr[largest];
arr[largest] = temp;
heapify(arr, largest, len);
}
} else {
return 'arr is not an Array or x is not a number!';
}
}好的,當(dāng)我們解決完排序的問(wèn)題,緊接著我們又面臨著數(shù)據(jù)去重的問(wèn)題,不要怕,解決方案依然有很多,請(qǐng)您慢慢往下接著看:
在工作上,對(duì)json數(shù)據(jù)處理時(shí),例如遇到對(duì)某些產(chǎn)品的尺碼進(jìn)行排序,不同的產(chǎn)品都有相同的尺碼那是正常不過(guò)的事情,如果我們要把這些轉(zhuǎn)成表格的形式來(lái)展現(xiàn),那么這些尺碼就不要不能重復(fù)才行.在這里呢,我就寫(xiě)幾個(gè)數(shù)組去重的方法,給大家參考參考 :
// 最簡(jiǎn)單數(shù)組去重法
/*
* 新建一新數(shù)組,遍歷傳入數(shù)組,值不在新數(shù)組就push進(jìn)該新數(shù)組中
* IE8以下不支持?jǐn)?shù)組的indexOf方法
* */
function uniq(array){
var temp = []; //一個(gè)新的臨時(shí)數(shù)組
for(var i = 0; i < array.length; i++){
if(temp.indexOf(array[i]) == -1){
temp.push(array[i]);
}
}
return temp;
}
var aa = [1,2,2,4,9,6,7,5,2,3,5,6,5];
console.log(uniq(aa));/*
* 速度最快, 占空間最多(空間換時(shí)間)
*
* 該方法執(zhí)行的速度比其他任何方法都快, 就是占用的內(nèi)存大一些。
* 現(xiàn)思路:新建一js對(duì)象以及新數(shù)組,遍歷傳入數(shù)組時(shí),判斷值是否為js對(duì)象的鍵,
* 不是的話給對(duì)象新增該鍵并放入新數(shù)組。
* 注意點(diǎn):判斷是否為js對(duì)象鍵時(shí),會(huì)自動(dòng)對(duì)傳入的鍵執(zhí)行“toString()”,
* 不同的鍵可能會(huì)被誤認(rèn)為一樣,例如n[val]-- n[1]、n["1"];
* 解決上述問(wèn)題還是得調(diào)用“indexOf”。*/
function uniq(array){
var temp = {}, r = [], len = array.length, val, type;
for (var i = 0; i < len; i++) {
val = array[i];
type = typeof val;
if (!temp[val]) {
temp[val] = [type];
r.push(val);
} else if (temp[val].indexOf(type) < 0) {
temp[val].push(type);
r.push(val);
}
}
return r;
}
var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));/*
* 給傳入數(shù)組排序,排序后相同值相鄰,
* 然后遍歷時(shí),新數(shù)組只加入不與前一值重復(fù)的值。
* 會(huì)打亂原來(lái)數(shù)組的順序
* */
function uniq(array){
array.sort();
var temp=[array[0]];
for(var i = 1; i < array.length; i++){
if( array[i] !== temp[temp.length-1]){
temp.push(array[i]);
}
}
return temp;
}
var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));/*
*
* 還是得調(diào)用“indexOf”性能跟方法1差不多,
* 實(shí)現(xiàn)思路:如果當(dāng)前數(shù)組的第i項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置不是i,
* 那么表示第i項(xiàng)是重復(fù)的,忽略掉。否則存入結(jié)果數(shù)組。
* */
function uniq(array){
var temp = [];
for(var i = 0; i < array.length; i++) {
//如果當(dāng)前數(shù)組的第i項(xiàng)在當(dāng)前數(shù)組中第一次出現(xiàn)的位置是i,才存入數(shù)組;否則代表是重復(fù)的
if(array.indexOf(array[i]) == i){
temp.push(array[i])
}
}
return temp;
}
var aa = [1,2,"2",4,9,"a","a",2,3,5,6,5];
console.log(uniq(aa));// 思路:獲取沒(méi)重復(fù)的最右一值放入新數(shù)組
/*
* 推薦的方法
*
* 方法的實(shí)現(xiàn)代碼相當(dāng)酷炫,
* 實(shí)現(xiàn)思路:獲取沒(méi)重復(fù)的最右一值放入新數(shù)組。
* (檢測(cè)到有重復(fù)值時(shí)終止當(dāng)前循環(huán)同時(shí)進(jìn)入頂層循環(huán)的下一輪判斷)*/
function uniq(array){
var temp = [];
var index = [];
var l = array.length;
for(var i = 0; i < l; i++) {
for(var j = i + 1; j < l; j++){
if (array[i] === array[j]){
i++;
j = i;
}
}
temp.push(array[i]);
index.push(i);
}
console.log(index);
return temp;
}
var aa = [1,2,2,3,5,3,6,5];
console.log(uniq(aa));吶,在選擇部門(mén)的時(shí)候,是不是會(huì)經(jīng)??吹竭@種樹(shù)狀菜單,后臺(tái)返回的數(shù)據(jù)一般都是平級(jí)的數(shù)組,那么這種菜單,我們一般是怎么生成的呢,請(qǐng)看~~

const dataTree = [
{id: 1, name: '總公司', parentId: 0},
{id: 2, name: '深圳分公司', parentId: 1},
{id: 3, name: '北京分公司', parentId: 1},
{id: 4, name: '研發(fā)部門(mén)', parentId: 2},
{id: 5, name: '市場(chǎng)部門(mén)', parentId: 2},
{id: 6, name: '測(cè)試部門(mén)', parentId: 2},
{id: 7, name: '財(cái)務(wù)部門(mén)', parentId: 2},
{id: 8, name: '運(yùn)維部門(mén)', parentId: 2},
{id: 9, name: '市場(chǎng)部門(mén)', parentId: 3},
{id: 10, name: '財(cái)務(wù)部門(mén)', parentId: 3},
]
function changeData(data, parentId = 0) {
let tree = [];//新建空數(shù)組
//遍歷每條數(shù)據(jù)
data.map((item) => {
//每條數(shù)據(jù)中的和parentId和傳入的相同
if (item.parentId == parentId) {
//就去找這個(gè)元素的子集去 找到元素中parentId==item.id 這樣層層遞歸
item.children = changeData(data, item.id);
tree.push(item);
}
})
return tree
}
console.log(changeData(dataTree, 0));
我們?cè)趫D表展示的時(shí)候會(huì)經(jīng)常遇到數(shù)據(jù)處理,其中數(shù)組合并處理也會(huì)經(jīng)常遇到,下面就是數(shù)組相同項(xiàng)合并的一種方式:

首先由原始的數(shù)組arr數(shù)據(jù),
然后創(chuàng)建一個(gè)map空對(duì)象和一個(gè)result空數(shù)組,通過(guò)判斷map中是否含有某項(xiàng)來(lái)判斷數(shù)組result是否添加數(shù)據(jù),
然后再判斷相同項(xiàng)和已有的result數(shù)組內(nèi)容比較合并;
var arr = [
{"id":"1","name":"車?yán)遄?quot;,"num":"245"},
{"id":"1","name":"車?yán)遄?quot;,"num":"360"},
{"id":"2","name":"蘋(píng)果","num":"120"},
{"id":"2","name":"蘋(píng)果","num":"360"},
{"id":"2","name":"蘋(píng)果","num":"180"},
{"id":"3","name":"香蕉","num":"160"},
{"id":"4","name":"菠蘿","num":"180"},
{"id":"4","name":"菠蘿","num":"240"}
];
var map = {},result= [];
for(var i = 0; i < arr.length; i++){
var ele = arr[i];
if(!map[ele.id]){
result.push({
id: ele.id,
name: ele.name,
value: ele.value
});
map[ele.id] = ele;
}else{
for(var j = 0; j < result.length; j++){
var dj = result[j];
if(dj.id == ele.id){
dj.value=(parseFloat(dj.value) + parseFloat(ele.value)).toString();
break;
}
}
}
};
console.log(result);到此,相信大家對(duì)“JavaScript數(shù)據(jù)處理的常見(jiàn)問(wèn)題如何解決”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
本文名稱:JavaScript數(shù)據(jù)處理的常見(jiàn)問(wèn)題如何解決
標(biāo)題鏈接:http://www.jbt999.com/article36/pcdhpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、面包屑導(dǎo)航、網(wǎng)站維護(hù)、網(wǎng)站制作、域名注冊(cè)、網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)