Java中的深拷貝和淺拷貝
技術標籤:javascript
陣列去重
方法1:利用ES6 Set去重
function unique(arr) {
return Array.from(new Set(arr))
}
var arr = [1, 2, 3, 4, 5, 2, 1, 9, 0, 5]
console.log(unique(arr));//=>[1, 2, 3, 4, 5, 9, 0]
利用filter去重
var r;
var arr = [1, 2, 3, 4, 5, 2, 1, 9, 0, 5]
r = arr.filter((element, index, self) => {
return self.indexOf(element) === index;
})
console.log(r)//=>[1, 2, 3, 4, 5, 9, 0]
指定去重元素 零
var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7];
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] != 0) {
newArr[newArr.length] = arr[i];
}
}
console.log(newArr);//=>[2, 6, 1, 77, 52, 25, 7]
選項:A/B/C等,至少選中一個
// 陣列中是否包含某個值:判斷陣列initArray裡面的值是否在陣列checkList中
var initArray = ['1', '41', '4', '3', '6'];
var checkList = ['0']
var newArray = initArray.map(v => {
return checkList.includes(v)
})
console.log('是否勾選了', newArray); // [false, false, false, false, false]
/*
陣列中至少有一個為true
陣列的some方法:如果有一個元素滿足條件,則表示式返回true , 剩餘的元素不會再執行檢測。
*/
var even = function (item, index, newArray) {
return item === true;
};
console.log(newArray.some(even)); //true
介面資料過濾
// 陣列擷取
res.data.body.data.forEach(i => {
this.tow_list.push({
value: i.Code,
name: i.Name
});
});
// 在陣列最前面新增一個物件元素
this.orderSource.unshift({
code: '',
name: '全部'
})
// 為數組裡面的物件新增屬性
this.$set(this.list[i],"isDisable",false);
// 為陣列的每個物件新增屬性 isLogin
var arr = [
{
type: String,
value: '10'
},
{
type: Object,
value: {
name: 'lisi',
age: '20'
}
}
]
for(var i in arr) {
arr[i].isLogin = true;
}
console.log(arr)
// Object.assign 物件合併
let hwSigningList_array = [];
list.map((item, index) => {
hwSigningList_array.push(
Object.assign(item, { doctorId: this.ruleForm.id })
)
});
判斷資料型別
// 說明返回的是陣列和數組裡面不為空
if( Array.isArray(res.data.body.data) && res.data.body.data.length > 0){
}
判斷某一個數值是否在數組裡面
[3,9,10].indexOf(3)
非空判斷
if (!this.ruleForm.ruleName || this.ruleForm.ruleName === '') {
this.$message({
message: "規則名稱不能為空",
type: "warning"
});
return;
}
資料拷貝
深拷貝陣列
var hwSigningList_copy = JSON.parse(JSON.stringify(this.hwSigningList))
this.hwSigningList_copy = hwSigningList_copy.map(x => {
return {
id: x.id,
imageScript: x.imageScript
}
})
本地儲存
/*
將json格式的字串轉換為陣列或者物件:JSON.parse(json字串)
將字面量物件或者陣列轉換為json格式的字串:JSON.stringify(物件或者陣列)
存資料:本地儲存只能儲存字串
*/
localStorage.setItem(‘key’, JSON.stringify(物件或者陣列));
// 取資料:
localStorage.getItem(‘key’) ;
keyArr = JSON.parse(localStorage.getItem(‘key’));
// 清空本地儲存資料:
localStorage.removeItem(“key”);
常用的方法
some函式
用於檢測陣列中的元素是否滿足指定條件
如果有一個元素滿足條件,則表示式返回true , 剩餘的元素不會再執行檢測
如果沒有滿足條件的元素,則返回false
注意事項:
- some() 不會對空陣列進行檢測
- some() 不會改變原始陣列
場景1:商品的收藏按鈕
// 1.獲取快取中的商品收藏資料
let collect = wx.getStorageSync("collect")|| [];
// 2.判斷當前商品是否被收藏
let isCollect = collect.some(v=>v.goods_id===this.GoodsInfo.goods_id);
every函式
用於檢測陣列所有元素是否都符合指定條件
如果陣列中檢測到有一個元素不滿足,則整個表示式返回 false ,且剩餘的元素不會再進行檢測
如果所有元素都滿足條件,則返回 true。
注意事項:
- 空陣列呼叫 every方法,返回值就是true
- every() 不會對空陣列進行檢測
- every() 不會改變原始陣列
場景1:全選功能
const allChecked = cart.length ? cart.every(v => v.checked) : false;
forEach函式
forEach()
方法用於呼叫陣列的每個元素,並將元素傳遞給回撥函式。
陣列.forEach(function(陣列當前項的值,陣列當前項的索引,陣列物件本身){ })
注意: forEach()
對於空陣列是不會執行回撥函式的。
抽離陣列的某些元素,組合成一個新陣列。陣列的每個物件都含有抽離出來的屬性
let array = [
{
goods_id: 0,
num: 10,
goods_price: 100,
goos: "gooos"
},
{
goods_id: 1,
num: 20,
goods_price: 200,
goos1: "goo1os"
},
{
goods_id: 2,
num: 30,
goods_price: 300,
gosos: "goodaos"
}
]
let goods = [];
array.forEach(v=>goods.push({
goods_id: v.goods_id,
goods_number: v.num,
goods_price: v.goods_price
}))
console.log(goods);//=> [{…}, {…}, {…}]
求和
//定義
var sum = 0;
this.list.forEach((item) => {
//遍歷prodAllPrice這個欄位,並累加
sum += item.prodAllPrice;
});
//返回
this.sum = sum;
split()方法
用於切分字串,它可以將字串切分為陣列。在切分完畢之後,返回的是一個新陣列
字串.split(“分割字元”)
例如:使用字串的 split 方法分割字串,以空格分隔 split(’ ') ;引號中間一定記得敲空格!!!
replace函式
replace() 方法用於在字串中用一些字元替換另一些字元,或替換一個與正則表示式匹配的子串
// 使用場景:iphone部分手機 不識別 webp 圖片格式
屬性.replace(/\.webp/g,'.jpg')
字串.replace(被替換的字串, 要替換為的字串);
includes函式
-
用來判斷一個數組是否包含一個指定的值
-
用於判斷字串是否包含指定的子字串
如果找到匹配的字串則返回 true,否則返回 false。
注意: includes() 方法區分大小寫。
使用場景1:判斷
url
中是否帶有 /my/ 請求的是私有的路徑 帶上header token
// 如果header還需要攜帶除token以外的引數,發起請求的時候當引數傳遞就可以了。
let header = { ...params.header };
// 判斷url中是否帶有 /my/ 請求的是私有的路徑 帶上header token
if (params.url.includes('/my/')) {
// 拼接header 帶上 token
header["Authorization"] = wx.getStorageSync("token")
}
filter
filter用於把Array的某些元素過濾掉,然後返回剩下的元素。
filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素。
filter()接收的回撥函式
- 第一個引數,表示Array的某個元素。
- 回撥函式還可以接收另外兩個引數,表示元素的位置和陣列本身:
在一個Array中,刪掉偶數,只保留奇數
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter( (x)=>{
return x % 2 !== 0;
});
r; // [1, 5, 9, 15]
把一個Array中的空字串刪掉
var arr = ['A', '', 'B', null, undefined, 'C', ' '];
var r = arr.filter( (s)=>{
return s && s.trim(); // 注意:IE9以下的版本沒有trim()方法
});
arr; // ['A', 'B', 'C']
獲取選中的商品
// 過濾後的購物車陣列
cart = cart.filter(v => v.checked);
基礎用法示例
var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) {
console.log(element); // 依次列印'A', 'B', 'C'
console.log(index); // 依次列印0, 1, 2
console.log(self); // self就是變數arr
return true;
});
程式碼演示
/*
filter方法 用於過濾資料 返回一個數組
filter方法接收一個匿名函式,引數就是陣列中的item項,
例如:從上面資料中過濾一個name為ccc的資料
只要filter方法的回撥函式中的比較運算子的結果為true,
那麼符合條件的物件就會被包在一個數組返回,比較結果為false的就被過濾掉了
*/
var array = [
{
age: 11, name: 'aaa'
},
{
age: 22, name: 'bbb'
},
{
age: 33, name: 'ccc'
}
];
var filter = array.filter(item => item.name === 'ccc')
console.log(filter) // [{age: 33, name: "ccc"}]
findIndex方法
當陣列中的元素在測試條件時返回 true 時, findIndex() 返回符合條件的元素的索引位置
,之後的值不會再呼叫執行函式,如果沒有符合條件的元素返回 -1
注意事項:
- findIndex() 對於空陣列,函式是不會執行的
findIndex()
並沒有改變陣列的原始值
選擇星期幾
choose (id) {
let index = this.list.findIndex((value, index, arr) => {
return value.value == id;
});
console.log(this.list[index].name)
}
choose(1);
list: [
{value: 1,name: "週一"},
{value: 2,name: "週二"},
{value: 3,name: "週三"},
{value: 4,name: "週四"},
{value: 5,name: "週五"},
]
判斷 當前的商品是否已經存在於 購物車
let index = cart.findIndex(v=>v.goods_id===this.GoodsInfo.goods_id);
if(index === -1){ //當前商品在購物車中不存在 }
map
map()
方法定義在JavaScript的Array
中,它返回一個新的陣列,陣列中的元素為原始陣列呼叫函式處理後的值
map方法接收一個匿名函式為引數,這個匿名函式又有三個引數
- 引數一:每個item項
- 引數二:陣列的索引
- 引數三:呼叫map方法的陣列本身,也就是陣列array
注意事項
map()
不會對空陣列進行檢測map()
不會改變原始陣列
// 方法一
this.orderSource = res.data.body.data.map(x => {
return {
code: x.code,
name: x.name
}
})
// 方法二
res.data.body.data.map(i => {
this.list.push({ value: i.id, name: i.name });
});
場景1:物件展開原樣返回;新增新屬性create_time_cn
需求:後臺返回的是時間戳(單位:秒);前臺需要的時間格式:2019/8/12 下午9:36:25
array.map(v=>({...v,create_time_cn:(new Date(v.create_time*1000).toLocaleString())}))
reduce