物件的判空、遍歷及轉換和對陣列的操作
阿新 • • 發佈:2018-12-17
在聯調時,發現後臺返回的不是陣列,或者返回的型別與不為空時的型別不一樣,這裡小結下對物件的操作
1.物件的判空
/* 先宣告一個物件字面量 */
let isObject = {};
- 將json物件轉化成json字串,然後進行判斷是否等於字串'{}',直接寫{}無法進行判斷
console.log(JSON.stringify(isObject) == '{}');
- 使用for迴圈來判斷,若不為空,則返回false
let listObject = { a: 1, b: 3, c: 4 }; function isEmptyObject() { for(let key in listObject) { return false; } return true; } console.log(isEmptyObject());
- 使用ES6的Object.keys()來判斷,返回的是一個數組,根據陣列長度來判斷
function isEmptyObject2(obj) {
return Object.keys(obj).length == 0;
}
console.log(isEmptyObject2(isObject));
- 對這個物件中一定存在的屬性進行判斷
console.log(isObject.id == null);
2.將物件轉換成陣列
let listData = {a: 1, b: 2, c: 3}; let temporaryArray = [];
- 只需要將物件中的值轉換成陣列時
for(let i in listData) {
temporaryArray.push(listData[i]);
}
console.log(temporaryArray);
- 將物件中的鍵與值一起轉換成陣列
let temporaryArray2 = []; for(let i in listData) { let temporaryObject = {}; temporaryObject[i] = listData[i]; temporaryArray2.push(temporaryObject); } console.log(temporaryArray2);
- 使用Object原生屬性
console.log(Object.values(listData));
3.將非陣列轉換成陣列
- Array.prototype.slice.call(arguments)
/* 該方法可以將類陣列物件轉換為陣列,所謂類陣列物件,就是含 length 和索引屬性的物件
* 返回的陣列長度取決於物件 length 屬性的值,並且非索引屬性的值或索引大於 length 的值都不會被返回到陣列中
* Array.prototype.slice.call(obj,start,end) start:方法中slice擷取的開始位置,end終止位置,預設從0開始
* */
let testObject = {
0: 'a',
1: 'b',
2: 'c',
name: 'admin',
length: 3,
};
/* 物件中必須定義length,且屬性值不能為非數字,非數字無法返回 */
console.log(Array.prototype.slice.call(testObject));
/* 或者簡寫為[].slice.call(testObject) */
console.log([].slice.call(testObject));
- Array.from()
/* Array、Set、Map 和字串都是可迭代物件(WeakMap/WeakSet 並不是可迭代物件)
* 這些物件都有預設的迭代器,即具有 Symbol.iterator 屬性
* 所有通過生成器建立的迭代器都是可迭代物件
* 可以用 for of 迴圈
* */
let testObject2 = {
0: 'a',
1: 'b',
2: 'c',
name: 'admin',
length: 3,
};
console.log(Array.from(testObject2));
4.判斷是否為陣列,返回true則為陣列
let temporaryArray3 = [1,2,1,2,3];
console.log(temporaryArray3 instanceof Array);
console.log(temporaryArray3.constructor == Array);
console.log(Array.isArray(temporaryArray3));
console.log(Object.prototype.toString.call(temporaryArray3) === "[object Array]");
5.將陣列轉換成鍵值對物件,可以利用for迴圈
let transformObject = Object.assign({}, temporaryArray3);
console.log(transformObject);
let transformObject2 = {...temporaryArray3};
console.log(transformObject2);
6.講講深拷貝與淺拷貝
淺拷貝其實只是引用的拷貝,兩者還是指向記憶體中的同一個地址
深拷貝就是兩者指向不同的記憶體地址,是真正意義上的拷貝
- Object.assign
assign對物件分配賦值,實現淺拷貝,但是它有一個特殊的地方,可以處理第一層的深拷貝。
assign(targetObject, obj, obj1) assign會改變targetObject的值,較好的做法就是將targetObject定義為空物件{}
assign是將這個3者合併,若有相同的屬性,後面的屬性會覆蓋前面物件的屬性
let temporaryObject2 = {a: 1, d: {e: 3}};
let temporaryObject3 = {b: 1,a: 2};
let mergeObject = Object.assign({}, temporaryObject2, temporaryObject3);
console.log(mergeObject);
/* mergeObject.d.e不會改變temporaryObject2裡a的值,但會改變temporaryObject2裡e的值 */
mergeObject.a = 5;
mergeObject.d.e = 5;
console.log(mergeObject);
- 較常用的物件深拷貝方法
let copyObject = JSON.parse(JSON.stringify(temporaryObject2));
console.log(copyObject);
copyObject.a = 0;
console.log(copyObject);
- 陣列slice淺拷貝
let copyArray = [1, 2, [1, 5], 3];
let copyArray1 = copyArray.slice(0);
console.log(copyArray1);
copyArray1[1] = 20;
copyArray1[2][1] = 23;
console.log(copyArray1);
- 陣列concat淺拷貝
let copyArray2 = copyArray.concat();
console.log(copyArray2);
copyArray2[1] = 20;
copyArray2[2][1] = 23;
console.log(copyArray2);