1. 程式人生 > 實用技巧 >Java中的深拷貝和淺拷貝

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

注意事項:

  1. some() 不會對空陣列進行檢測
  2. some() 不會改變原始陣列

場景1:商品的收藏按鈕

// 1.獲取快取中的商品收藏資料
let collect = wx.getStorageSync("collect")|| [];
// 2.判斷當前商品是否被收藏
let isCollect = collect.some(v=>v.goods_id===this.GoodsInfo.goods_id);

every函式

用於檢測陣列所有元素是否都符合指定條件

如果陣列中檢測到有一個元素不滿足,則整個表示式返回 false ,且剩餘的元素不會再進行檢測

如果所有元素都滿足條件,則返回 true。

注意事項:

  1. 空陣列呼叫 every方法,返回值就是true
  2. every() 不會對空陣列進行檢測
  3. 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()接收的回撥函式

  1. 第一個引數,表示Array的某個元素。
  2. 回撥函式還可以接收另外兩個引數,表示元素的位置和陣列本身:

在一個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

注意事項:

  1. findIndex() 對於空陣列,函式是不會執行的
  2. 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

注意事項

  1. map()不會對空陣列進行檢測
  2. 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