相关文章推荐
风流的板凳  ·  odoo12 ...·  1 年前    · 
冷冷的奔马  ·  list clear 释放内存-掘金·  1 年前    · 
谦和的手术刀  ·  五种在 JavaScript ...·  1 年前    · 
·  阅读 字符串去重、数组去重、对象去重、嵌套去重(全)
去重这个词,在我们程序员的日常中还是很常见的,字符串、数组、对象、嵌套形式的去重,各种去重应用场景,最近有空整理整理各种数据的去重方法,这里整理的都是按照常规的数据,特殊的先不考虑,主要是看处理方法和思路。

一、字符串去重

1.indexOf 方法

const str = 'asdfasd'
const ChangeStr = (data) => {
  let newstr = ''
  for(i in data){
    if(i==data.indexOf(data[i])){
     //for循环遍历,判断当前值是否等于当前下标
    //indexOf方法返回第一个查找元素下标
    //注意:for循环的 i 类型都是string,所以不要用严格等于判断
      newstr += data[i]
  return newstr
//if()里的条件判断,判断data和newstr都可以
console.log(ChangeStr(str))
// "asdf"
复制代码

2.search 方法

const str = 'asdfasd'
const ChangeStr = (data) => {
  let newstr = ''
  for(i in data){
    if(i==data.search(data[i])){
   //indexOf与search方法一样,获取元素下标,没有返回-1
      newstr += data[i]
  return newstr
//if()里的条件判断,判断data和newstr都可以
console.log(ChangeStr(str))
// "asdf"
复制代码

3.includes 方法

const str = 'asdfasd'
const ChangeStr = (data) => {
  let newstr = ''
  for(i in data){
    if(!newstr.includes(data[i])){
    //es6的新语法,过程是严格判断
      newstr += data[i]
  return newstr
console.log(ChangeStr(str),'ChangeStr')
// "asdf"
复制代码

4.Set 方法

 const str = 'asdfasd'
 const ChangeStr = ( data ) =>  [... new Set(data)].join('')
 //用es6的Set去重,转成数组,再转字符串
 console.log( ChangeStr( str ), 'ChangeStr' )
// "asdf"
复制代码

这里双重for循环就不讲了,循环用少用,耗性能。

二、数组去重 string | number [ ]

1.indexOf 方法

const data = [ 1, 2, 2, 4, 5, 4 ]
const ChangeArr = ( data ) => {
  const newarr = []
  data.map( ( item, index ) => {
    if ( data.indexOf( item ) === index ) {
      newarr.push( item )
    //判断当前下标与元素下标是否一致,一致说明是唯一的
    //可以判断newarr是否存在该值
  return newarr
console.log( ChangeArr( data ), 'ChangeArr' )
//  [1, 2, 4, 5]
复制代码

2.sort 方法

const data = [ 1, 2, 2, 4, 5, 4 ]
const ChangeArr = ( data ) => {
  const newarr = []
  data.map( ( item, index ) => {
    if ( data.indexOf( item ) === index ) {
      newarr.push( item )
    //先排序然后判断当前下标与元素下标是否一致,一致说明是唯一的
  return newarr
console.log( ChangeArr( data ), 'ChangeArr' )
//  [1, 2, 4, 5]
复制代码

3.includes 方法

const data = [ 1, 2, 2, 4, 5, 4 ]
const ChangeArr = ( data ) => {
  const newarr = []
  for ( let i = 0; i < data.length; i++ ) {
    // if(newarr.indexOf(data[i])===-1){
    //for每个值,用下标判断新数组存不存在
    if ( !newarr.includes( data[ i ] ) ) {
      //用es6新语法includes判断是否存在
      newarr.push( data[ i ] )
  return newarr
console.log( ChangeArr( data ), 'ChangeArr' )
//  [1, 2, 4, 5]
复制代码

4.Set 方法

const data = [ 1, 2, 2, 4, 5, 4 ]
const ChangeArr = ( data ) => {
  return Array.from( new Set( data ) )
  // es6的Set方法去重
  return [...new Set(data)]
  // es6的Set和数组解构赋值,该方法可用与字符串去重
console.log( ChangeArr( data ), 'ChangeArr' )
//  [1, 2, 4, 5]

三、对象去重

对象里不会存在一样的属性名,每个属性对应一块固定内存 最终创建结果就是,后面的覆盖前面的,对象的去重,主要就是Object.keys()和Object.values()转成数组,然后跟数组一样去重,以及hasOwnProperty的运用。

1.Object+includes

//应用场景,添加了多个值,把对象里值相同的去重
const data = {col: 4,col1: 5,col2: 6,col3: 4,col5: 5}
const ChangeObj = (data) => {
  const newobj = {}
  Object.keys( data ).map( ( item ) => {
    if ( !Object.values( newobj ).includes( data[ item ] ) ) {
      newobj[ item ] = data[ item ]
  return newobj
console.log( ChangeObj( data ), 'ChangeObj' )
// {col: 4, col1: 5, col2: 6}
复制代码

四、嵌套式复杂去重

1.forEach 合并数组内name重复的对象

要求数组中的对象,拥有同样name的,把数据去重合并到一个对象里

const data = [ {
  name: '小明',
  hobbies: '跳舞'
  name: '小红',
  hobbies: '唱歌'
  name: '小明',
  hobbies: '打球'
  name: '小明',
  hobbies: '滑雪'
  name: '小红',
  hobbies: '打人'
  name: '小东',
  hobbies: '吹气球'
const ChangeArr = ( data ) => {
  const newobj = {}
  if ( data && data.length > 0 ) {
    data.forEach( ( k ) => {
      if ( newobj[ k.name ] ) {
        newobj[ k.name ] =
          newobj[ k.name ] + ' | ' + k.hobbies
      } else {
        newobj[ k.name ] = k.hobbies
  return newobj
console.log( ChangeArr( data ), 'ChangeArr' )
// {小明: "跳舞 | 打球 | 滑雪", 小红: "唱歌 | 打人", 小东: "吹气球"}
复制代码

2.对象数组根据对象的某key值去重

const data = [ {
  id: 1,
  name: '111'
  id: 2,
  name: '222'
  id: 3,
  name: '333'
  id: 1,
  name: '444'
  id: 2,
  name: '555'
const ChangeArr = ( data ) => {
  const newobj = {}
  if ( data && data.length > 0 ) {
    data.forEach( ( item ) => {
      newobj[ item.id ] = item
  return newobj
console.log( ChangeArr( data ), 'ChangeArr' )
// { 1: {id: 1, name: "444"} ,2: {id: 2, name: "555"},3: {id: 3, name: "333"} }
复制代码

3.格式一致的对象数组去重

//JSON.stringify转成字符串,就可以去重了,前提是数据格式是严格
const data =[{name:1,age:1},{name:2,age:2},{name:1,age:1},{name:2,age:2}]
const ChangeArr = (data) => {
  const newdata = data.map(item => (JSON.stringify(item)))
  return [...new Set(newdata)]
console.log(ChangeArr(data))
// ["{"name":1,"age":1}", "{"name":2,"age":2}"]
复制代码

4.多维数组去重

正常递归方法

const data = [1,[2,3],[3,2,[1,6,[3,5,'3']]]]
const allarr = new Set() //直接创建一个Set数据,后面去重用
const ChangeArr = (array)=>{
  var len = array.length
  for (var i = 0; i < len ;i ++) {
    if (typeof array[i] == 'object') { // 如若数组元素类型是object,则递归
      ChangeArr(array[i])
    } else {
      allarr.add(array[i]) // 否则添加到allarr数组中
console.log(ChangeArr(data))
console.log([...allarr],'11111')
// [1, 2, 3, 6, 5, "3"] "11111"
复制代码

方法二

arr.flat()数组的新方法,自动将维度

const data = [1,[2,3],[3,2,[1,6,[3,5,'3']]]]
const ChangeArr = (array)=>{
  return  [...new Set(data.flat(Infinity))]
console.log(ChangeArr(data))

更多数据格式去重后期追加,有复杂格式的去重需求,评论区留下数据格式

分类:
代码人生
  •