对象方法
Array.prototype.entries()
entries() 方法返回一个新的Array Iterator 对象,该对象包含数组中每个索引的键/值对
let array = ["a","b","c"]
let iterator = array.entries()
for (let e of iterator){
console.log(e)
}
//[ 0, 'a' ]
[ 1, 'b' ]
[ 2, 'c' ]
实际应用
1.循环对象
for in
var obj = {a:1, b:2, c:3};
for (var prop in obj) { // prop即为 key
console.log("obj." + prop + " = " + obj[prop]);
}
// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
Object.keys() 和 Object.values()
传入对象,返回 包含对象可枚举属性和方法的数组
var obj = {'a':'123','b':'345'};
console.log(Object.keys(obj)); //['a','b']
var obj1 = { 100: "a", 2: "b", 7: "c"};
console.log(Object.keys(obj1)); // console: ["2", "7", "100"]
var obj = {
'0': 'a',
'1': 'b',
'2': 'c'
};
Object.keys(obj).forEach(function (key) {
console.log(key, obj[key])
});
如何判断一个对象是否为空
Object.keys(obj).length 通过对象的可枚举属性的个数来判断
2.对提交表单数据中的值进行不为空的判断
一般情况下只进行第一层的判断,也就是判断对象的值是否为空,遇到数组的情况下,可以单独抽出来进行处理
obj ={
id:"",
list:[
{name:""}
],
data:{
}
}
3.判断对象数组中是否存在某个对象
flag 方法
//执行操作 push新数组进入 如果有存在的名称 则不进行push
var ArrayList = [{
name: "1",
value: {}
}, {
name: "2",
value: {}
}, {
name: "3",
value: {}
}]
/*
传递参数 原数组 push内容 name
*/
function pushArray(array, info, name) {
let flag = true
let result = array
result.forEach(item => {
if (item.name == name) {
flag = false
return
}
})
if (flag) {
result.push(info)
} else {
console.log("已经存在")
}
}
let info = {
name: "2",
value: {}
}
pushArray(ArrayList, info, "1") //已经存在
some 用法
function pushArray(array, info, name) {
let result = array
let flag = result.some(item => {
return item.name === name
})
if (flag) {
console.log("已经存在")
} else {
result.push(info)
}
}
4.对象数组根据某一属性查找对象
例子:
在 array 数组中查找 name 是 zhangsan 的这个对象
let array = [{name: "zhangsan", age: 20}, {name: "lisi", age: 30}]
方法一:find
[
{
id: 1,
name: 'a'
},
{
id: 2,
name: 'b'
},
].find(function (x) {
return x.id === 10
})
方法二:组装新对象
list.forEach(function (item) {
selectObj[item.name] = item
})
selectObj新对象结构为:
{"zhangsan": {name: "zhangsan", age: 20}, "lisi": {name: "lisi", age: 30}},
通过selectObj[zhangsan]即可获取
5.优雅的取一个深度的值
https://segmentfault.com/q/1010000016285893
场景: 后台返回的对象中,我需要取出里面 student 的值,但是有可能后台返回给我的是 {school: null} 或者 {} 甚至是 undefined,因此我取值时可能是。如何优雅取值且不报错 Cannot read property ‘xxx’ of undefined
let student = obj?(obj.school?(obj.school.class1?(obj.school.class1.studnet?obj.school.class1.studnet:''):''):''):'';
let obj = {
school: {
class1: {
student: 50
}
}
}
解决
function safeProps(func, defaultVal) {
try {
return func();
} catch (e) {
return defaultVal;
}
}
safeProps(function(){
student = obj.school.class1.student
}, -1)
使用 lodash 库 lodash/get
lodash/get
_.get(obj,'school.class1.student', undefined)
6.从一个对象取部分属性给另一个对象
有一个很多属性的对象,我想取出其中部分属性给另一个对象,用了ES6的解构和对象的简写,发现还是有点蠢,需要的属性还是需要写两遍,想问问有没有更好的办法?
lodash _.pick 方法(推荐)
var object = { 'a': 1, 'b': '2', 'c': 3 };
_.pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }
delete 方法
只适用于一层的数组,因为Object.assign 不是深拷贝,如果obj为 {a: 1, b: { c: 2 }}时,删除 obj2.b.c 时,obj.b.c 也会被删除为空对象
let obj = { a: 1, b: 2, c: 3 };
let obj2 = Object.assign({}, obj);
delete obj2.b;
console.log(obj); //{a: 1, b: 2, c: 3}
console.log(obj2); // {a: 1, c: 3}
ES6 解构
var obj = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5
}
var {a, d, e} = obj
var obj2 = {a, d, e}
//当不选的属性值比较少的情况,可以这种写法
let {a, c, ...pick} = obj;
console.log(pick);
reduce 封装方法(推荐)
var obj = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
};
const pick = (obj, arr) =>
// arr.reduce((iter, val) => (val in obj && (iter[val] = obj[val]), iter), {});
arr.reduce((iter, val) => {
if (val in obj) {
iter[val] = obj[val];
}
return iter;
}, {});
let obj2 = pick(obj, ["a", "d", "e"]);
console.log(obj2);
extend() 函数
function extend(obj){
var o = {}
var attr = Array.prototype.slice.call(arguments).slice(1) // 截取需要的参数
attr.forEach((val,index)=>{
if(val in obj){
o[val] = obj[val]
}
})
return o
}
console.log(extend(obj, 'c', 'b'));
实际应用-补充
将数组里某个属性相同的对象合并成一个数组
根据指定属性,对对象数组中的对象进行分组
let resData = [
{
"name": "住院医疗最高报销",
"tagName": "医疗",
"insuredAmount": "6000"
},
{
"name": "身故赔付",
"tagName": "寿险",
"insuredAmount": "36.00"
},
{
"name": "烦死了免费陈述事实",
"tagName": "寿险",
"insuredAmount": "8888.00"
},
{
"name": "你好,噜噜噜",
"tagName": "寿险",
"insuredAmount": "66.00"
},
{
"name": "120种重大疾病确诊赔付",
"tagName": "重疾",
"insuredAmount": "350000"
}
]
let Data = [
{
"tagName": "医疗",
dataInfo: [
{
"name": "住院医疗最高报销",
"tagName": "医疗",
"insuredAmount": "6000"
}
]
},
{
"tagName": "寿险",
dataInfo: [
{
"name": "身故赔付",
"tagName": "寿险",
"insuredAmount": "36.00"
},
{
"name": "烦死了免费陈述事实",
"tagName": "寿险",
"insuredAmount": "8888.00"
},
{
"name": "你好,噜噜噜",
"tagName": "寿险",
"insuredAmount": "66.00"
},
]
},
{
"tagName": "重疾",
dataInfo: [
{
"name": "120种重大疾病确诊赔付",
"tagName": "重疾",
"insuredAmount": "350000"
}
]
}
]
let dataInfo = {}
resData.forEach(item=>{
let {tagName} = item
// 如果该属性在对象中不存在 先开辟空间
if(!dataInfo[tagName]){
dataInfo[tagName] = {
tagName,
child:[]
}
}
dataInfo[tagName].child.push(item)
})
let list = Object.values(dataInfo)
console.log(list)
let tempArr = []
let Data =[] //最后的数据
let temp = resData.forEach(item=>{
// 不存在
if(tempArr.indexOf(item.tagName) === -1){
Data.push({
tagName:item.tagName,
dataInfo: [item]
})
tempArr.push(item.tagName)
}else{
// 查找value
let id = Data.findIndex(value=>value.tagName === item.tagName)
Data[id].dataInfo.push(item)
}
})
方案三:reduce
const result6 = arr6.reduce((acc,curr)=>{
const currentVal = curr['tagName']
if(!acc[currentVal]){
acc[currentVal] = []
}
acc[currentVal].push(curr)
return acc
},{})
console.log(result6)
拓展:展示形式为根据某个属性分组
function arrGroup (arr, fn) {
const keyArr = [...new Set(arr.map(item => fn(item)))];
return keyArr.map(key => arr.filter(i => i.tagName === key));
}
let result6 = arrGroup(arr6,(item)=>item.tagName);
console.log(result6);
function arrGroup(arr, fn) {
const obj = {};
arr.forEach(item => {
const key = JSON.stringify(fn(item));
obj[key] = obj[key] || [];
obj[key].push(item)
});
return Object.keys(obj).map(k => {
return obj[k];
})
}
const newArr = arrGroup(list, (item) => item.tagName)
console.log(newArr)
https://blog.csdn.net/weixin_40805079/article/details/93092601