目標:把數組中反覆的內容去掉。
eg:將數組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,”1″]變成[2, 3, 1, 4, 5, “1”]。
思緒1:
每次掏出數組 一項,和其他的一切項比較
假如比較 有雷同的 , 把反覆的這個(背面的)刪掉。
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 5,"1"];
//遍曆數組
for(var i=0;i<arr.length;i++){
//每次比較i 以後的內容
for(var j=i+1;j<arr.length;j++){
if(arr[i]===arr[j]){
//刪除背面的這一個。
//j是位置,1示意長度。
//這個要領不清楚的 能夠看我這一篇文章 https://segmentfault.com/a/1190000014973607
arr.splice(j,1);
//刪除以後,數組長度會減1,要想比較剔除的背面一名。因為數組長度變短,后一名提早了,故j要減1。
j--;
}
}
}
console.log(arr);
</script>
思緒二:
預備一個 空數組 res
然後遍歷 arr
假如 arr中這一項 在 res中不存在,
則把這一項 放進 res中
假如 存在
什麼都不做
末了獲得的res,就是去重獲得后的數組。
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, "1"]; // [2,3,1,4]
var res=[2];
for(var i=0;i<arr.length;i++){
//返回值不等於-1則表明,res中沒有arr[i],這一項。
if(compare(res,arr[i])!==-1){
//往res中增加arr[i]這一項
res.push(arr[i]);
}
}
console.log(res);
function compare(res,arr) {
for(var j=0;j<res.length;j++) {
//假如遍歷res歷程中有相等值的話,馬上返回-1,完畢遍歷。
if(arr === res[j])
return -1;
}
//假如for 輪迴完畢了,還沒跳出函數,示意res中沒有arr,則返回1。
return j;
}
</script>
思緒一和思緒二存在的瑕玷:假如數組內容中含有兩個NAN,因為NAN不等於它自己。故刪選不出來。
思緒三:
統計一切項湧現的次數,構成一個對象
對象的鍵名 是 每一項的元素 ,
對象的鍵值 是 該項湧現的次數.
末了我們只需要 統計一切的鍵名就能夠了
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2]; // [2,3,1,4]
var res={};
var resArr=[];
// {
// 2: 4,
// 3: 2,
// 1: 2,
// 4: 3
// }
for(var i=0;i<arr.length;i++){
// 鍵名 in 對象
// 假如對象中有此鍵名,則返回true
// 不然,返回false
if(arr[i] in res){
//存在,則對應的鍵值+1。
res[ arr[i] ]+=1;
}else{
//不存在,則設置對應鍵名,而且鍵值=1。
res[ arr[i] ]=1;
}
}
//遍歷對象
for(i in res){
//將鍵名插進去數組
resArr.push(i);
}
console.log(resArr);
</script>
這個要領存在的題目就是:
1.假如數組中存在数字1,和字符串“1”,當遍歷鍵名的時刻,兩則是一樣的,獲得的數組會少了数字1.
2.鍵名是以字符串的體式格局存儲的,插進去數組的時刻,也是以字符串的體式格局存儲到數組中去。
革新思緒三
<script>
var arr = [2, 2, 3, 4, 1, 4, 2,"1",undefined]; // [2,3,1,4]
var res={};
var resArr=[];
// {
// 2: 4,
// 3: 2,
// 1: 2,
// 4: 3
// }
for(var i=0;i<arr.length;i++){
//鍵名是 數據類型的前三位+arr[i]構成的字符串。
temp=(typeof arr[i]).substr(0,3)+arr[i];
if(temp in res){
res[ temp ]+=1;
}else{
res[ temp ]=1;
}
}
console.log(res);
for(i in res){
// 截取 鍵名的前三位
// substr(0,3)包含最先,不包含完畢。截取的字符串 0,1,2位
var temp=i.substr(0,3);
if(temp=="num"){
//截取 鍵名從第三位最先截取。
resArr.push(Number(i.substring(3)));
}
if(temp=="str"){
resArr.push(i.substr(0,3));
}
if(temp=="und"){
resArr.push(undefined);
}
}
console.log(resArr);
</script>
思緒四
運用 es6的Set ...
<script>
var arr = [2, 3, 1, 4, 2, 2, 3, 4, 1, 4, 2, "1", NaN, NaN]; // [2,3,1,4]
//Set要領能夠去除數組內反覆的
// ... 表明睜開數組的每一項
var res=[...(new Set(arr))];
console.log(res);
</script>