资讯专栏INFORMATION COLUMN

对象的判空、遍历及转换和对数组的操作

liangzai_cool / 3349人阅读

摘要:在联调时,发现后台返回的不是数组,或者返回的类型与不为空时的类型不一样,这里小结下对对象的操作对象的判空先声明一个对象字面量将对象转化成字符串,然后进行判断是否等于字符串,直接写无法进行判断使用循环来判断,若不为空,则返回使用来判断,返回的

在联调时,发现后台返回的不是数组,或者返回的类型与不为空时的类型不一样,这里小结下对对象的操作
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());

使用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);
正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)

往期好文推荐:

判断ios和Android及PC端

纯css实现瀑布流(multi-column多列及flex布局)

实现文字的省略号

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98675.html

相关文章

  • 报表工具JS开发--字符串

    摘要:它将在中查找与相匹配的子字符串,然后用来替换这些子串。这里举个字符串替换的例子结果将返回字符串的查找方法用于检索字符串中指定的子字符串,他将返回中第一个与相匹配的子串的起始位置。其中是起始,提取长度为的新字符串。 在报表开发过程中,有些需求可能无法通过现有的功能来实现,需要开发人员二次开发,以FineReport为例,可以使用网页脚本、API接口等进行深入的开发与控制。考虑到JS脚本开...

    pakolagij 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<