成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

javascript - 數組去重的問題

瀏覽:144日期:2023-05-08 11:00:13

問題描述

假設現在有一個對象數組

arr=[ { id:1, content:’a’ },{ id:2, content:’b’ },{ id:2, content:’c’ },{ id:3, content:’d’ },{ id:3, content:’e’ },{ id:3, content:’f’ },{ id:3, content:’g’ },{ id:4, content:’h’ },]

我想去掉相同的id 然后保留各個id的最后一項

arr=[ { id:1, content:’a’ },{ id:2, content:’c’ },{ id:3, content:’g’ },{ id:4, content:’h’ },]

有什么好一點的方法嘛。。

問題解答

回答1:按慣例,ES6 代碼

const result = arr.reduce((r, t) => { // 在結果中查找 index, // 如果找到,更新該位置的對象引用 // 找到則加一個 var i = r.findIndex(m => m.id === t.id); if (i >= 0) {r[i] = t; } else {r.push(t); } return r;}, []);

這里有一個問題,findIndex 至少有兩個瀏覽器不支持,所以,如果不支持的話,只好自己寫一個

Array.prototype.findIndex = Array.prototype.findIndex || function(predicate) { for (let i = 0; i < this.length; i++) {if (predicate(this[i])) { return i;} } return -1;};其它解法經典解決,用 Map

因為 id 不是字符串,所以使用 ES6 的 Map 類。當數據量大的時候,使用查找表,比在列表中線性查找,效率會有顯著的提升。

const result = arr .reduce((m, t) => {const { map, list } = m;var index = map.get(t.id);if (index >= 0) { list[index] = t;} else { map.set(t.id, list.length); list.push(t);}return m; }, {map: new Map(),list: [] }) .list;

其實也可以用對象來代替 map,至少在這個用例中不會有問題。因為沒用 es6 特性,索性完全使用 es5 語法。代碼結構和邏輯與上面那段一樣

var result = arr .reduce(function(m, t) {var index = m.map[t.id];if (index >= 0) { m.list[index] = t;} else { m.map[t.id] = m.list.length; m.list.push(t);}return m; }, {map: {},list: [] }) .list;怪異解法,利用整數 id

因為是整數 id,所以可以直接按這個 id 放在數組中。如果遇到相同 id,直接就替換了。如果 id 不連續,最后需要把空元素過濾掉

var result = arr .reduce(function(r, t) {r[t.id] = t;return r; }, []) .filter(function(t) { return t; });

這種解法還有個問題,不能保持原數組的元素順序。然后肯定會有人想到,用 Map 的那個解法也可以把代碼精減成類似的代碼,而不需要搞那么復雜,當然它也同樣可能失去原有順序

const map = arr .reduce((m, t) => {m.set(t.id, t);return m; }, new Map());const result = [...map.values()];

注:以上所有代碼均實際運行通過,運行環境 Node v8.1.2

回答2:

var result = arr.filter(function(val, index) { /** * 使用arr.slice(index + 1)獲取從當前索引下一個元素到數組最后一個元素組成的數組 * 使用findIndex在當前項的后面選項中查找是否有和當前項id值相同的選項 */ var index = arr.slice(index + 1).findIndex(function(item) { return item.id === val.id; }); // 如果為-1,則說明后面沒有同名id了,所以這一項可以返回 return index === -1;});console.log(result);

使用箭頭函數簡化如下:

var result = arr.filter((val, index) => arr.slice(index + 1).findIndex(item => item.id === val.id) === -1);console.log(result);回答3:

這里面已經有很多答案了,不過沒有提到Array的內置函數reduceRight,實際上題主的需求,要求保留相同id的最后一位,用reduceRight實現起來很方便。

arr.reduceRight((r,v)=>{ if(!r[0].has(v.id)) r[0].add(v.id) && r[1].unshift(v) return r},[new Set,[]])[1]

reduceRight從你原數組尾部開始循環的,我這里的初始值是個數組,r[0]用來存放id的Set,r[1]存放結果數組,如果Set里沒有id,那么就添加這個id到Set,并且把這一項放在結果數組的頭部。

最終很容易的實現了題主的需求,而且順序也能保證。

回答4:

function uniq(arr) { var idArr = [],arr2 = [] for (var i = 0, len = arr.length; i < len; i++) {if (arr[i].id in idArr) { arr2.pop() arr2.push(arr[i])} else { idArr.push(arr[i].id) arr2.push(arr[i])} } return arr2}

親測有效

回答5:

arr = [ { id: 1, content: ’a’ },{ id: 2, content: ’b’ },{ id: 2, content: ’c’ },{ id: 3, content: ’d’ },{ id: 3, content: ’e’ },{ id: 3, content: ’f’ },{ id: 3, content: ’g’ },{ id: 4, content: ’h’ } ]tmp = []for(k in arr){tmp[arr[k][’id’]] = arr[k][’content’]}arr = []for(k in tmp){arr.push({’id’:+k, ’content’:tmp[k]})}console.log(arr)[ { id: 1, content: ’a’ }, { id: 2, content: ’c’ }, { id: 3, content: ’g’ }, { id: 4, content: ’h’ } ]回答6:

let newArr = [],

result = [], status = false, lastResult = []for (let i = arr.length - 1; i >= 0; i--) { newArr.push(arr[i])}for (let i = 0, len = newArr.length; i < len; i++) { if (result.length == 0) {result.push(newArr[0]) } for (let j = 0; j < result.length; j++) {if (newArr[i].id == result[j].id) { console.log(newArr[i]) status = true} } if (!status) {result.push(newArr[i]) } status = false}for (let i = result.length - 1; i >= 0; i--) { lastResult.push(result[i])}console.log(lastResult) //為去掉相同的id 然后保留各個id的最后一項回答7:

var arr = [ ... ]; // 這個為給定的數組var obj = {}; // 定義一個對象存儲arr.forEach(function(v) { obj[v.id] = v; // 不管如何,直接將數組賦值給obj中下標為v.id的項,這樣對應的v.id的值到最后必然是同ID最后一項});// 下面考慮兼容性給出新語法和常規語法// 新語法,Object.values部分瀏覽器版本不支持var result = Object.values(obj);// 常規語法,用Array.map實現Object.values的效果var result = Object.keys(obj).map(function(id) { return obj[id];});回答8:

參考一下

Array.from(arr.reduce((map, el) => map.set(el.id, el), new Map()).values())回答9:

你可以參考我博客寫的,我博客上寫了8中方法。http://alfierichou.top/2017/0...

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
日韩一级二级三级| 亚洲尤物视频在线| 日韩 欧美一区二区三区| 91精品国产91久久久久久一区二区 | k8久久久一区二区三区| |精品福利一区二区三区| 欧美午夜寂寞影院| 国产欧美日韩一区| 欧美日韩国产精品一卡| 国产毛片精品视频| 日日夜夜精品视频天天综合网| 国产精品私房写真福利视频| 欧美久久久久久蜜桃| 久久国产精品亚洲va麻豆| 亚洲午夜久久久久久尤物| 国产乱人伦偷精品视频免下载| 亚洲激情图片一区| 国产欧美一区二区精品性| 欧美乱妇15p| 日本电影欧美片| 亚洲一区一卡| 国产精品免费区二区三区观看| 国产一区自拍视频| 欧美一区免费视频| 99久久精品免费看国产| 国产夫妻精品视频| 国产精品一区二区久久精品爱涩 | 色综合色狠狠综合色| 日本vs亚洲vs韩国一区三区二区| 久久久久久久久久久久久夜| 日韩一区二区三区视频| 欧美福利一区二区| 日韩女优制服丝袜电影| 日韩免费看的电影| 欧美一激情一区二区三区| 欧美一卡二卡在线| 91麻豆精品91久久久久同性| 欧美日本韩国一区二区三区视频| 玖玖国产精品视频| 日本高清不卡视频| 色久综合一二码| 狼狼综合久久久久综合网 | 一区二区三区四区乱视频| 亚洲精品乱码久久久久久久久| 一区二区在线看| 天天操天天干天天综合网| 香蕉乱码成人久久天堂爱免费| 日韩专区欧美专区| 蜜臀av性久久久久蜜臀aⅴ四虎| 麻豆一区二区在线| 国产成人av电影在线播放| 色综合久久综合网| 亚洲电影专区| 亚洲一区二区三区精品在线观看| 久久精品日韩欧美| 久久午夜激情| 91精品国产乱| 国产欧美一区二区三区鸳鸯浴| 国产精品热久久久久夜色精品三区 | 日韩欧美国产综合一区| 精品成人一区二区三区四区| 国产色一区二区| 一区二区三区在线视频观看| 亚洲午夜一区二区三区| 一本色道久久综合亚洲精品不卡| 91亚洲精品久久久蜜桃| 亚洲国产日韩在线| 在线看国产一区二区| 久久免费国产| 亚洲午夜视频在线观看| 在线播放日韩导航| 国产精品高清一区二区三区| 欧美日韩精品| 日韩av在线发布| 2021中文字幕一区亚洲| 日韩五码在线| 国产一区二区三区美女| 欧美激情一区二区在线| 国产色综合网| 高清不卡一区二区在线| 亚洲欧洲综合另类| 91精品国产色综合久久不卡蜜臀| 国产综合久久| 免费成人av在线| 国产欧美日韩激情| 欧美午夜影院一区| 91丨porny丨在线| 五月激情综合婷婷| 国产午夜亚洲精品理论片色戒 | 亚洲人成网站在线| 欧美日韩国产另类一区| 伊人久久婷婷色综合98网| 精品在线观看免费| 中文字幕av免费专区久久| 国产欧美日韩亚洲一区二区三区| 精品av久久707| 亚洲3atv精品一区二区三区| 国产91精品一区二区麻豆网站 | 国产精品久久夜| 国内外成人在线| 国产亚洲精品久久飘花| 久久女同精品一区二区| 日韩成人一级大片| 欧美日韩三级电影在线| 欧美三级日韩三级国产三级| 亚洲精选一二三| 91在线观看下载| 5566中文字幕一区二区电影| 日韩二区三区在线观看| 国产精品久久777777毛茸茸| 国产精品污网站| 国产精品888| 欧美日韩黄色一区二区| 天天av天天翘天天综合网| 99精品国产99久久久久久福利| 日韩免费一区二区| 精品在线观看免费| 先锋影音久久| 最新国产精品久久精品| 97国产一区二区| 欧美一区二区三区四区高清| 免费看欧美美女黄的网站| 一本大道久久a久久综合婷婷| 亚洲精品v日韩精品| 1024亚洲| 综合av第一页| 国产一区二区三区奇米久涩| 亚洲视频免费看| 一本色道精品久久一区二区三区 | 日韩成人一区二区三区在线观看| heyzo一本久久综合| 欧美一区日韩一区| 国产99一区视频免费| 在线播放中文一区| 韩国欧美国产一区| 91麻豆精品国产自产在线观看一区 | 国产亚洲美州欧州综合国| 国产一区三区三区| 91精品午夜视频| 不卡视频在线观看| 国产亚洲福利社区一区| 99精品国产99久久久久久白柏| 欧美一卡二卡在线| 91捆绑美女网站| 国产欧美日韩卡一| 欧美精品国产一区二区| 国产肉丝袜一区二区| 欧美一区二区| 综合欧美亚洲日本| 亚洲在线一区| 日本欧美久久久久免费播放网| 亚洲欧美日韩精品一区二区| 午夜视频在线观看一区二区三区| 色中色一区二区| 久久精品72免费观看| 精品久久久久久亚洲综合网| 91免费观看视频| 亚洲精品欧美专区| 色婷婷综合久久久中文字幕| 精品一区二区三区免费| 26uuu亚洲综合色欧美| 97精品国产露脸对白| 日本一区二区成人| 国产一区二区高清视频| 捆绑紧缚一区二区三区视频| 日韩午夜激情电影| 激情综合网址| 日韩成人一级片| 精品久久久久99| 国产婷婷精品| 国产一二精品视频| 中文字幕永久在线不卡| 久久一区中文字幕| 99免费精品在线观看| 亚洲免费毛片网站| 欧美蜜桃一区二区三区| 国产精品sss| 视频一区视频二区中文| 久久影院午夜片一区| 国产一区二区三区奇米久涩| 国产精品 欧美精品| 国产蜜臀av在线一区二区三区| 国产精品免费在线| a亚洲天堂av| 日韩福利视频导航| 久久久久97国产精华液好用吗| 免费视频一区| 欧美国产综合视频| 日本欧美在线观看| 国产精品久久夜| 777xxx欧美| 亚洲一区视频| 91色九色蝌蚪| 裸体一区二区三区| 亚洲视频在线一区| 日韩免费看网站| 欧美在线看片a免费观看| 国产一区自拍视频| 丰满岳乱妇一区二区三区| 亚洲已满18点击进入久久|