例1
var arr = [ { date: "2018-01-10", time: "11:00" }, { date: "2018-01-10", time: "12:00" }, { date: "2018-11-27", time: "1:00、2:00", }, { date: "2018-11-27", time: "3:00、4:00" }, { date: "2018-01-10", time: "5:00" } ];
// 输出 [ { date: "2018-11-27", time: "1:00、2:00、3:00、4:00" }, { date: "2018-01-10", time: "5:00" } ]
----------------------------------------------------------------------------------------------------------
var res = arr.reduce((pre, cur)=> { let i = pre.findIndex(v=> v.date===cur.date) if(i>-1){ pre[i].time = [pre[i].time, cur.time].join('、') }else{ pre.push(cur) } return pre }, []) console.log(res)
// 同理 var arr = [{a:1, b:2}, {a:1, c:3}, {a:4, d:5}]
// 得到 [{a:1, b:2, c:3}, {a:4, d:5}]
var res = arr.reduce((pre, cur) => {
let i = pre.findIndex(v => v.a = cur.a)
if (i > -1) {
pre[i].c = cur.c
} else pre.push(cur)
return pre
}, [])
------------------------------------------------------------------------------------------------------------
var arr =[{a:1,b:2,c:2},{a:1,b:2,c:3},{a:2,b:3,c:2},{a:2,b:3,c:2},{a:1,b:4,c:2}];
// 得到 [{a: 1, b: 2, c: 5}, {a: 2, b: 3, c: 4}, {a: 1, b: 4, c: 2}]
var res = arr.reduce((pre, cur)=>{
let i = pre.findIndex(v=> v.a === cur.a && v.b === cur.b)
i > -1 ? pre[i].c = cur.c + pre[i].c : pre.push(cur)
return pre
}, [])
console.log(res)
----------------------------------------------------------------------------------------------------------------
两个数组比较,拿出相同数据跟不同数据
var arr1 = ["1", "2", "3", "5"]
var arr2 = [{id: "1"},{id: "2"},{id: "3"},{id: "4"}]
var map = new Map(arr2.map(v=> [v.id, v]))
var [res1, res2] = arr1.reduce(([res1, res2], cur)=>{
map.has(cur) ? res1.push(map.get(cur)) : res2.push(cur)
return [res1, res2]
}, [[], []])
console.log(res1, res2)
例2
var arr1 = [{id: 1,name: '小明'}, {id: 2,name: '小强'}]; var arr2 = [{id: 1,age: 10}, {id: 2, age: 20}]; // 输出 [{id: 1, name: '小明', age: 10}, {id: 2,name: '小强', age: 20}] ---------------------------------------------------------------------------------------------------------- var res = arr2.reduce((pre, cur)=> { let same = arr1.find(v=> v.id===cur.id) pre.push(Object.assign({}, cur, same)) return pre }, []) console.log(res)
例3 统计数组中相同项出现的个数
var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; var res = names.reduce((pre, cur)=> { pre[cur] = pre[cur] ? ++pre[cur] : 1 return pre }, {}) for(var i in obj){ console.log(i, obj[i]) }
例4 数组的降维 (多维嵌套数组转化为单个数组)
如 [11, 20, 30, [17, 18, [9, 8, [1, 2, 3]]]] 输出 [11, 20, 30, 17, 18, 9, 8, 1, 2, 3]
var arr = [11,20,30,[17,18,[9,8,[1,2,3]]]] var res = arr => arr.reduce((pre, cur)=> { Array.isArray(cur) ? pre.push(...res(cur)) : pre.push(cur) return pre }, []) console.log(res(arr)) // 递归实现: function flatten(arr){ var arr2=[] for(var i=0;i<arr.length;i++){ cur = arr[i] Array.isArray(cur) ? arr2.push(...flatten(cur)) : arr2.push(cur) } return arr2 } console.log(flatten([[0, 1,[6,7,8,9]], [2, 3], [4, 5]])) // 1.数组扁平化、2.去除其中重复数据、3.得到一个升序且不重复的数组 方法1:var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10] function flatten(arr){ let res = arr.reduce((pre, cur)=>{ Array.isArray(cur)?pre.push(...flatten(cur)):pre.push(cur) return pre }, []) return [...new Set(res)].sort((a,b)=>a-b) } console.log(flatten(arr)) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] 方法2: var arr = [ [1, 2, 2], [3, 4, '5', 5], [6, 7, 8, 9, [11, 12, [12, '13', [14] ]] ], '10'] console.log([...new Set(arr.flat(Infinity))].sort((a,b)=>a-b))
例5 数组(对象)去重 + 多数组的合并去重
// 数组去重 var arr = [1,1,1,22,3,,4,4] var res = [...new Set(arr)] console.log(res) var arr = [1,1,1,22,3,4,4] var res = arr.filter((v, i, pre)=> pre.indexOf(v) === i) // 数组对象去重 var arr = [{a:1,b:2},{a:1,b:2},{a:3,b:1},{a:5,b:2},{a:3,b:1}];//对象数组 var res = arr.reduce((pre, cur)=>{ var i = pre.findIndex(v=>JSON.stringify(v)===JSON.stringify(cur)) if(i===-1){ pre.push(cur) } return pre }, []) // 多数组的合并去重 var arr1 = [1,2,3,4] var arr2 = [1,2,3,4,5,6] var res = [...new Set([...arr1, ...arr2])] console.log(res)
例6 代码正常运行
Array.prototype.multiply = function(){ return this.push(...this.map(v=>v*v)) } var a = [1,2,3,4,5] a.multiply() console.log(a) // [1,2,3,4,5,1,4,9,25]
例7 项目中遇到的数据结构
var data = { "ETH": { "PPTR": [{ "curno": "KRW", "price": null }, { "curno": "JPY", "price": null }, { "curno": "USD", "price": null }, { "curno": "CNY", "price": '1' }], "ETH": [{ "curno": "KRW", "price": null }, { "curno": "JPY", "price": null }, { "curno": "USD", "price": null }, { "curno": "CNY", "price": '5' }] }, "USDT": { "USDT": [{ "curno": "KRW", "price": null }, { "curno": "JPY", "price": null }, { "curno": "USD", "price": null }, { "curno": "CNY", "price": '10' } ] }, 'eoc':[] } var arr = [] for (let [key, val] of Object.entries(data)) { for(let [key1, val1] of Object.entries(val)){ val1.reduce((cur, pre)=>{ arr.push({chain: key, symbol: key1, ...pre}) }, []) } } console.log(arr)
例8 一段很溜的代码
var a = [ { key: "id",num: "111" }, { key: "age", num: "222" } ]; var b = [ { key: "age",initVal: "23"}, { key: "id",initVal: "001"} ] var merge = (a,b) =>[...a.concat(b).reduce((m, x) => m.set(x.key, Object.assign(m.get(x.key) || {}, x)), new Map()).values()] console.log(merge(a,b))