javascript - Problème de déduplication de tableau
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-28 09:24:12
0
9
622

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 ? .

女神的闺蜜爱上我
女神的闺蜜爱上我

répondre à tous(9)
漂亮男人

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

某草草
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);
仅有的幸福

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.

曾经蜡笔没有小新
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

伊谢尔伦
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' } ]
滿天的星座

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的最后一项
学习ing
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];
});
Peter_Zhu

Veuillez vous y référer

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

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...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!