一个含有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 的用法:

  1. 求和:
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
  1. 计算数组中每个元素出现的次数:
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 }
  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]
  1. 对象里的属性求和:
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
上一篇下一篇

猜你喜欢

热点阅读