1.es5 es6数组去重排序
方法一(es5):
简单的循环套循环遍历对比
function way1(arr){
var arr1 = [arr[0]];
for(var i = 1;i<arr.length;i++){
var repeat = false;
for(var j = 0;j<arr1.length;j++){
if(arr[i] === arr1[j]){
repeat = true;
break;
}
}
if(!repeat){
arr1.push(arr[i])
}
}
return arr1;
}
方法二(es5):
先排序,取出新的值与相邻的值进行对比:
function way2(arr){
var arr2 = arr.sort();
var arr3 = [arr2[0]];
for(var i=1; i<arr2.length; i++){
if(arr2[i] !== arr3[arr3.length-1]){
arr3.push(arr2[i]);
}
}
return arr3;
}
方法三:
①利用es6中set容器的特点:set容器是无序不可重复的多个value的集合体,将数组作为参数传入会自动去重
②循环遍历 for(let value of target){},可遍历数组,set容器,map容器,字符串,伪数组
let arr = [1,2,3,3,4,4,5,6,6,7]
let arr1 = arr;
arr = [];
let set2 = new Set(arr1);
for(let i of set2){
arr.push(i);
}
console.log(arr);// [1, 2, 3, 4, 5, 6, 7]
方法四:
Array.from(v) : 将伪数组对象或可遍历对象转换为真数组
let arr = [3,3,4,5,6,1,3,5,5,6,1]
arr = Array.from(new Set(arr));
console.log(arr);// [3, 4, 5, 6, 1]
2.随机生成数
let randomIndex = arr[Math.floor(Math.random() * arr.length)];
随机取数
function getRandomArrElement(arr, count) {
let res = []
while (res.length < count) {
// 生成随机 index
let randomIdx = (Math.random() * arr.length) >> 0;
// splice 返回的是一个数组
res.push(arr.splice(randomIdx, 1)[0]);
}
return res
}
js求两个数组的交集|并集|差集|去重
- 第一种解决方案: filter+includes
let difference = a.concat(b).filter(v => !a.includes(v))
2)第二种解决方案:Set+Array.from
let aSet = new Set(a)
let bSet = new Set(b)
let difference = Array.from(new Set(a.concat(b).filter( v => !aSet.has(v) )))
- 第三种解决方案:filter+indexOf
// 并集
var union = a.concat(b.filter(function(v) {
return a.indexOf(v) === -1}))
[1,2,3,4,5]
// 交集
var intersection = a.filter(function(v){ return b.indexOf(v) > -1 })
// [2]
// 差集
var difference = a.filter(function(v){ return b.indexOf(v) === -1 })
// [1,3]
二分法查找算法
function binarySearch(arr, data) {
var end = arr.length - 1,
start = 0;
while (start <= end) {
var middle = Math.floor((start + end) / 2);
if (arr[middle] > data) {
end = middle - 1;
} else if (arr[middle] < data) {
start = middle + 1;
} else {
return middle;
}
}
return -1;
}