recherche

Maison  >  Questions et réponses  >  le corps du texte

javascript - Problème de déduplication de tableau

Supposons maintenant qu'il y ait un tableau d'objets

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'
    },
]

Je souhaite supprimer le même identifiant et conserver le dernier élément de chaque identifiant

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

Y a-t-il une meilleure façon ? .

女神的闺蜜爱上我女神的闺蜜爱上我2709 Il y a quelques jours653

répondre à tous(9)je répondrai

  • 漂亮男人

    漂亮男人2017-06-28 09:26:12

    Par convention, code 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;
    }, []);

    Il y a un problème ici, findIndex Au moins deux navigateurs ne le supportent pas, donc s'il ne le supporte pas, vous devez en écrire un vous-même

    Array.prototype.findIndex = Array.prototype.findIndex || function(predicate) {
        for (let i = 0; i < this.length; i++) {
            if (predicate(this[i])) {
                return i;
            }
        }
        return -1;
    };

    Autres solutions

    Solution classique, utilisez Map

    Parce que l'identifiant n'est pas une chaîne, utilisez la classe ES6 Map. Lorsque la quantité de données est importante, l’utilisation d’une table de recherche peut améliorer considérablement l’efficacité par rapport à la recherche linéaire dans une liste.

    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;

    En fait, vous pouvez également utiliser des objets au lieu de cartes, au moins dans ce cas d'utilisation, il n'y aura aucun problème. Comme il n'y a pas de fonctionnalités es6, nous utilisons simplement la syntaxe es5. La structure et la logique du code sont les mêmes que celles du paragraphe ci-dessus

    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;

    Solution étrange, utilisant un identifiant entier

    Comme il s'agit d'un identifiant entier, vous pouvez le mettre directement dans le tableau en fonction de cet identifiant. Si le même identifiant est rencontré, il sera remplacé directement. Si les identifiants ne sont pas consécutifs, vous devez filtrer les éléments vides à la fin

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

    Il y a un autre problème avec cette solution. Elle ne peut pas maintenir l'ordre des éléments du tableau d'origine. Ensuite, quelqu'un pensera certainement que la solution utilisant Map peut également réduire le code en un code similaire sans le rendre si compliqué. Bien sûr, elle peut également perdre l'ordre d'origine

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

    Remarque : tous les codes ci-dessus ont été exécutés et transmis, et l'environnement d'exécution est Node v8.1.2

    répondre
    0
  • 某草草

    某草草2017-06-28 09:26:12

    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);

    L'utilisation des fonctions fléchées simplifie comme suit :

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

    répondre
    0
  • 仅有的幸福

    仅有的幸福2017-06-28 09:26:12

    Il y a déjà beaucoup de réponses ici, mais il n'y a aucune mention de la fonction intégrée de Array réduireRight. En fait, l'exigence du questionneur est de conserver le dernier chiffre du même identifiant, ce qui est très pratique à implémenter en utilisant réduireRight.

    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 commence la boucle à partir de la fin de votre tableau d'origine. La valeur initiale ici est un tableau r[0] est utilisé pour stocker l'ensemble des identifiants, et r[1] stocke le tableau de résultats s'il n'y a pas d'identifiant dans le. Set, puis ajoutez cet identifiant à Set et placez cet élément en tête du tableau résultant.

    Au final, les besoins du propriétaire du sujet ont été facilement satisfaits et la commande a été garantie.

    répondre
    0
  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-06-28 09:26:12

    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
    }

    Testé personnellement et efficace

    répondre
    0
  • 伊谢尔伦

    伊谢尔伦2017-06-28 09:26:12

    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' } ]

    répondre
    0
  • 滿天的星座

    滿天的星座2017-06-28 09:26:12

    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的最后一项

    répondre
    0
  • 学习ing

    学习ing2017-06-28 09:26:12

    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];
    });

    répondre
    0
  • 天蓬老师

    天蓬老师2017-06-28 09:26:12

    Veuillez vous y référer

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

    répondre
    0
  • 为情所困

    为情所困2017-06-28 09:26:12

    Vous pouvez vous référer à ce que j'ai écrit sur mon blog. J'ai écrit 8 méthodes sur mon blog. http://alfierichou.top/2017/0...

    répondre
    0
  • Annulerrépondre