日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

javascript - 數(shù)組去重的問題

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

問題描述

假設(shè)現(xiàn)在有一個(gè)對(duì)象數(shù)組

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 然后保留各個(gè)id的最后一項(xiàng)

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

有什么好一點(diǎn)的方法嘛。。

問題解答

回答1:按慣例,ES6 代碼

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

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

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

因?yàn)?id 不是字符串,所以使用 ES6 的 Map 類。當(dāng)數(shù)據(jù)量大的時(shí)候,使用查找表,比在列表中線性查找,效率會(huì)有顯著的提升。

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;

其實(shí)也可以用對(duì)象來代替 map,至少在這個(gè)用例中不會(huì)有問題。因?yàn)闆]用 es6 特性,索性完全使用 es5 語法。代碼結(jié)構(gòu)和邏輯與上面那段一樣

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;怪異解法,利用整數(shù) id

因?yàn)槭钦麛?shù) id,所以可以直接按這個(gè) id 放在數(shù)組中。如果遇到相同 id,直接就替換了。如果 id 不連續(xù),最后需要把空元素過濾掉

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

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

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

注:以上所有代碼均實(shí)際運(yùn)行通過,運(yùn)行環(huán)境 Node v8.1.2

回答2:

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

使用箭頭函數(shù)簡化如下:

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

這里面已經(jīng)有很多答案了,不過沒有提到Array的內(nèi)置函數(shù)reduceRight,實(shí)際上題主的需求,要求保留相同id的最后一位,用reduceRight實(shí)現(xiàn)起來很方便。

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從你原數(shù)組尾部開始循環(huán)的,我這里的初始值是個(gè)數(shù)組,r[0]用來存放id的Set,r[1]存放結(jié)果數(shù)組,如果Set里沒有id,那么就添加這個(gè)id到Set,并且把這一項(xiàng)放在結(jié)果數(shù)組的頭部。

最終很容易的實(shí)現(xiàn)了題主的需求,而且順序也能保證。

回答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 然后保留各個(gè)id的最后一項(xiàng)回答7:

var arr = [ ... ]; // 這個(gè)為給定的數(shù)組var obj = {}; // 定義一個(gè)對(duì)象存儲(chǔ)arr.forEach(function(v) { obj[v.id] = v; // 不管如何,直接將數(shù)組賦值給obj中下標(biāo)為v.id的項(xiàng),這樣對(duì)應(yīng)的v.id的值到最后必然是同ID最后一項(xiàng)});// 下面考慮兼容性給出新語法和常規(guī)語法// 新語法,Object.values部分瀏覽器版本不支持var result = Object.values(obj);// 常規(guī)語法,用Array.map實(shí)現(xiàn)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...

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久中文亚洲字幕| 日韩中文字幕91| 日韩激情中文字幕| 亚洲精品自拍| 日韩av一区二区在线影视| 日本中文字幕一区二区| 亚洲一区二区毛片| 视频一区欧美日韩| 日韩高清二区| 久久99视频| 中文字幕在线官网| 91亚洲国产成人久久精品| 一本大道色婷婷在线| 99视频精品全部免费在线视频| 九九色在线视频| 国内精品福利| 日av在线不卡| 日本精品另类| 免费日韩一区二区三区| 精品一区二区三区的国产在线观看| 成人精品动漫一区二区三区| 国内不卡的一区二区三区中文字幕| 国产+成+人+亚洲欧洲在线| 偷拍精品精品一区二区三区| 欧美精品一区二区三区精品| 欧美专区在线| 国产日产精品_国产精品毛片| 精品日本视频| 群体交乱之放荡娇妻一区二区| 亚洲国产专区| 久久亚洲色图| 国产三级精品三级在线观看国产| 国产精品久久| 亚洲三级欧美| 亚洲综合电影一区二区三区| 欧美午夜三级| 精品美女视频| 午夜av一区| 国产午夜一区| 韩国精品主播一区二区在线观看| 香蕉成人久久| 麻豆国产欧美一区二区三区 | 国产精品极品| 免费在线小视频| 日韩影院免费视频| 精品伊人久久| 性欧美69xoxoxoxo| 欧美日韩va| 色婷婷狠狠五月综合天色拍| 蜜臀av性久久久久蜜臀aⅴ四虎| 国产精品视频首页| 日本精品影院| 欧美日一区二区在线观看| 美女av在线免费看| 亚洲精品在线二区| 五月激情久久| 日本欧美一区| 一区二区小说| 欧美在线精品一区| 久久狠狠婷婷| 国产欧美一区二区色老头| 免费污视频在线一区| 欧美伊人影院| 国产精品美女久久久| 精品久久影院| 日韩高清一区二区| 伊人精品视频| 免费日韩av片| 日韩欧美自拍| 欧美日韩一区二区三区在线电影| 首页国产精品| 欧美日韩精品一区二区三区视频| 免费黄色成人| 国内一区二区三区| 少妇精品久久久| 欧美va亚洲va日韩∨a综合色| 欧美精品国产一区| 亚洲少妇自拍| 色婷婷精品视频| 久久久免费人体| 亚洲精品少妇| 亚洲激情中文在线| 国产盗摄——sm在线视频| 日本va欧美va精品发布| 91精品二区| 亚洲天堂免费电影| 麻豆国产精品一区二区三区| 亚洲久久视频| 久久av免费| 欧美在线首页| 深夜日韩欧美| 樱桃成人精品视频在线播放| 水蜜桃久久夜色精品一区| 欧美日韩一视频区二区| 美女精品一区| 欧美 日韩 国产精品免费观看| 久久久久久网| 精品国产91| 久久av国产紧身裤| 国产美女亚洲精品7777 | 激情91久久| 成人日韩在线观看| 三上亚洲一区二区| 国产成人精品一区二区三区免费| 久久精品xxxxx| 在线精品观看| 免费成人性网站| 亚洲综合不卡| 性欧美长视频| 久久亚洲二区| 蜜臀91精品一区二区三区| 午夜久久tv| 99国产精品私拍| 国产精品社区| 久久夜色精品| 亚洲在线久久| 亚洲精品自拍| 日韩高清成人在线| 日韩和欧美一区二区三区| 亚洲综合中文| 中文字幕亚洲影视| 亚洲天堂日韩在线| 热久久国产精品| 蜜桃视频一区二区| 免费在线观看一区二区三区| 久久福利精品| 亚洲精品日本| 91欧美日韩在线| 国产欧美啪啪| 亚洲伊人精品酒店| 日韩福利在线观看| 国产麻豆精品久久| 精品视频国内| 精精国产xxxx视频在线野外| 日韩高清不卡| 久久精品国产大片免费观看| 国产一区亚洲| 国产精品日韩欧美一区| 在线免费观看亚洲| 欧美日本久久| 高清一区二区三区| 欧美综合另类| 免费不卡在线视频| 日本电影久久久| 久久中文字幕一区二区三区| 四季av一区二区凹凸精品| 久久一级电影| 蜜桃视频在线观看一区| 国产日韩精品视频一区二区三区| 欧美激情网址| 香蕉成人av| 免费日韩视频| 国产精品欧美在线观看| 神马午夜在线视频| 国产婷婷精品| 欧美亚洲一区二区三区| 精品三区视频| 女同性一区二区三区人了人一| 中文字幕日本一区二区| 国产精品一区二区三区四区在线观看| 久久精品国产99国产| 欧美三级精品| 亚洲精品国产精品粉嫩| 精品国产欧美日韩| 亚洲尤物在线| 国产精品hd| 欧美色图国产精品| 亚洲精品一二三**| 97国产成人高清在线观看| 不卡中文字幕| 国产一区 二区| 日韩免费视频| 亚洲1区在线观看| 黑森林国产精品av| 亚洲午夜免费| 日韩成人免费| 亚洲精品婷婷| av高清不卡| 日本成人在线一区| 日韩在线短视频| 视频一区日韩精品| 精品少妇一区| 亚洲精品护士| 国产不卡一区| 日本一区二区三区视频在线看| 国产成人77亚洲精品www| 中文一区一区三区免费在线观| 日韩1区2区| 日本一区二区三区中文字幕| 欧美香蕉视频| 欧美一区自拍| 一本一道久久a久久精品蜜桃| 国产欧美精品| 国产亚洲一区在线| 国产aⅴ精品一区二区四区| 蜜桃视频一区二区三区| 超碰成人av| 国产视频网站一区二区三区| 狠狠干成人综合网| 日产精品一区二区|