一个含有n个不重复元素的无序数组,将其分割成多个连续的数字数组
2019-02-25 本文已影响0人
郭先生_515
例如:
let arr = [1,2,3,7,8,9,15,17,18,19,4,12,14,25];
// 得到的结果:
let result = [ [ 1, 2, 3, 4 ], [ 7, 8, 9 ], [ 12 ], [ 14, 15 ], [ 17, 18, 19 ], [ 25 ] ]
首先数组是无序的,我们要先通过冒泡法将数组变成一个从小到大的有序数组,然后通过js方法将数组切成一段段连续的数组。
(注:此题要求是无重复元素,若数组中含有重复元素,应先去重。)
实现代码,如下:
let arr = [1,2,3,7,8,9,15,17,18,19,4,12,14,25];
// 冒泡排序,将数组变成有序数组;
for (var i = 0; i < arr.length-1; i++) {
for (var j = 0; j < arr.length-i-1; j++) {
if (arr[j] > arr[j+1]){
let tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
console.log(arr);
// let arr = [ 1, 2, 3, 4, 7, 8, 9, 12, 14, 15, 17, 18, 19, 25 ];
function splitArr(arr) {
let result = [], i = 0;
result[i] = [arr[i]];
arr.reduce(function(prev, cur){
cur - prev === 1 ? result[i].push(cur) : result[++i] = [cur];
return cur;
})
console.log(result);
}
splitArr(arr);
此例子,用到了ES6数组的新特性 reduce,下面介绍一下 reduce 的用法:
- 求和:
var arr1 = [1, 2, 3, 4];
var sum = arr1.reduce(function(prev, cur, index) {
console.log(prev, cur, index);
return prev + cur;
}, 2); // 注意这里可以设置初始值,写0,初始值 prev 就是0。
console.log(arr1, sum);
// 输出结果:
// 2 1 0
// 3 2 1
// 5 3 2
// 8 4 3
// [ 1, 2, 3, 4 ] 12
- 计算数组中每个元素出现的次数:
let num = [1,2,3,4,5,6,7,5,3,2,1,4,1];
let nums = num.reduce((prev, cur) => {
if (cur in prev){
prev[cur]++;
}else{
prev[cur]=1;
}
return prev;
}, {});
console.log(nums);
// { '1': 3, '2': 2, '3': 2, '4': 2, '5': 2, '6': 1, '7': 1 }
- 数组去重:
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((prev,cur)=>{
if(!prev.includes(cur)){
return prev.concat(cur)
}else{
return prev;
}
},[])
console.log(newArr);
// [1, 2, 3, 4]
- 对象里的属性求和:
var result = [
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
{
subject: 'english',
score: 30
}
];
var sum = result.reduce(function(prev, cur) {
return cur.score + prev;
}, 0);
console.log(sum);
//60