对象方法
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即为 keyconsole.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新数组进入 如果有存在的名称 则不进行pushvar ArrayList = [{name: "1",value: {}}, {name: "2",value: {}}, {name: "3",value: {}}]/*传递参数 原数组 push内容 name*/function pushArray(array, info, name) {let flag = truelet result = arrayresult.forEach(item => {if (item.name == name) {flag = falsereturn}})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 = arraylet 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} = objvar 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{// 查找valuelet 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
