JavaScript verwijder herhalingen uit een array

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • jandeman023
  • Registratie: Oktober 2015
  • Laatst online: 02-10 01:24
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
    {
        "foo": "piet",
        "doo": "aaa111"
    },
    {
        "foo": "piet",
        "doo": "bbb222"
    },
    {
        "foo": "jan",
        "doo": "ccc333"
    },
    {
        "foo": "henk",
        "doo": "ddd444"
    },
    {
        "foo": "henk",
        "doo": "fff555"
    }
]


Dit is mijn array. Dit is het eindresultaat dat ik graag zou willen hebben:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
    {
        "foo": "piet",
        "daa": "aaa111"
    },
    {
        "foo": "jan",
        "daa": "ccc333"
    },
    {
        "foo": "henk",
        "daa": "ddd444"
    }
]


Dit betekend dat ik wil filteren op de 'foo'. Dit heb ik al geprobeerd met .filter maar ik krijg het niet voor mekaar ook heb ik gezocht op google maar daar kom ik ook niet verder. Kan iemand mij een duw in de goede richting geven?

Acties:
  • +1 Henk 'm!

  • D4NG3R
  • Registratie: Juli 2009
  • Laatst online: 21:34

D4NG3R

kiwi

:)

Als het een simpele array was geweest zou ik je hebben aangeraden om met Array.from() een nieuwe array gevuld met unieke waarden te maken, maar je huidige array is er eentje gevuld met objecten, je zal deze dus (voor zover ik weet) onderling moeten vergelijken d.m.v. een nested for-loop.

[ Voor 40% gewijzigd door D4NG3R op 08-12-2017 16:19 ]

Komt d'r in, dan kö-j d’r oet kieken


Acties:
  • +1 Henk 'm!

  • jugger naut
  • Registratie: September 2010
  • Laatst online: 20:58
https://www.google.nl/sea...tes+from+array+javascript

Zit er hier misschien iets tussen waar je het antwoord kan vinden?

Acties:
  • +1 Henk 'm!

  • Swedish Clown
  • Registratie: November 2010
  • Laatst online: 10-04 22:41

Swedish Clown

Erlang <3

jandeman023 schreef op vrijdag 8 december 2017 @ 16:03:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
    {
        "foo": "piet",
        "doo": "aaa111"
    },
    {
        "foo": "piet",
        "doo": "bbb222"
    },
    {
        "foo": "jan",
        "doo": "ccc333"
    },
    {
        "foo": "henk",
        "doo": "ddd444"
    },
    {
        "foo": "henk",
        "doo": "fff555"
    }
]


Dit is mijn array. Dit is het eindresultaat dat ik graag zou willen hebben:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
    {
        "foo": "piet",
        "daa": "aaa111"
    },
    {
        "foo": "jan",
        "daa": "ccc333"
    },
    {
        "foo": "henk",
        "daa": "ddd444"
    }
]


Dit betekend dat ik wil filteren op de 'foo'. Dit heb ik al geprobeerd met .filter maar ik krijg het niet voor mekaar ook heb ik gezocht op google maar daar kom ik ook niet verder. Kan iemand mij een duw in de goede richting geven?
Hoe wil je de beslissing maken welke van de “Henk” en “piet” je wilt behouden? Zo op het oog is het de eerste maar weet je dit 100% zeker?

Heb je controle over de data? Zoja, zou ik daar de logica aanpassen om dit geintje te voorkomen. Zo niet weet je 100% zeker dat ordening gegarandeerd wordt? ;)

Always looking for developers wanting to work with Erlang.


Acties:
  • 0 Henk 'm!

  • jandeman023
  • Registratie: Oktober 2015
  • Laatst online: 02-10 01:24
Ik ben er zelf uitgekomen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function removeDuplicates(originalArray, objKey) {
                                    var trimmedArray = [];
                                    var values = [];
                                    var value;

                                    for(var i = 0; i < originalArray.length; i++) {
                                        value = originalArray[i][objKey];

                                        if(values.indexOf(value) === -1) {
                                            trimmedArray.push(originalArray[i]);
                                            values.push(value);
                                        }
                                    }

                                    return trimmedArray;

                                }

                                console.log(removeDuplicates(array, 'foo'));


toch thanks allemaal voor de tips!

[ Voor 88% gewijzigd door jandeman023 op 08-12-2017 16:50 ]


Acties:
  • +1 Henk 'm!

  • BarôZZa
  • Registratie: Januari 2003
  • Laatst online: 17:21
De makkelijkste oplossing is een tweede array maken waarin je de waarde opslaat van foo en met een for-loop erdoorheen te lopen. Staat hij al in de lookup array, dan sla je hem over.

Is het vooral om de concepten goed te begrijpen van de Array functies binnen javascript, dan zou ik kijken naar Array.Map en daarmee een nieuwe array te genereren (pseudocode uit mijn hoofd: Array.Map(function(val){return val.foo;})) met alleen de waardes van foo. Dan kan je daar met filter de duplicates uithalen en vervolgens weer mappen met de gegevens uit de originele array.

edit: too late.

Overigens is indexOf redelijk sloom bij grote arrays, een hash lookup is sneller. dus in plaats van push(value), array[value]=true

[ Voor 11% gewijzigd door BarôZZa op 08-12-2017 16:56 ]


Acties:
  • +1 Henk 'm!

  • akooi
  • Registratie: December 2000
  • Laatst online: 06-10 18:33
Zoiets zou moeten werken.

Met dus een helper array , om de uniwque waarden van foo bij te houden.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var originObj =[
    {
        "foo": "piet",
        "doo": "aaa111"
    },
    {
        "foo": "piet",
        "doo": "bbb222"
    },
    {
        "foo": "jan",
        "doo": "ccc333"
    },
    {
        "foo": "henk",
        "doo": "ddd444"
    },
    {
        "foo": "henk",
        "doo": "fff555"
    }
]

var resultObj = [];
var foos = [];
for (var i in originObj){
 if (foos.indexOf(originObj[i].foo) == -1)
    resultObj.push(originObj[i]);
  foos.push(originObj[i].foo);
}
console.log(resultObj);

Acties:
  • +1 Henk 'm!

  • Vaudtje
  • Registratie: April 2002
  • Niet online
BarôZZa schreef op vrijdag 8 december 2017 @ 16:54:

Overigens is indexOf redelijk sloom bij grote arrays, een hash lookup is sneller. dus in plaats van push(value), array[value]=true
Als je daadwerkelijk aan het werken bent met key/value pairs, zou je zelfs je output datastructuur daarop kunnen aanpassen als dat mogelijk is:
JSON:
1
2
3
4
5
{ 
        "piet": "aaa111",
        "jan": "ccc333",
        "henk":"fff555"
}

In deeze zin staan drie fauten


Acties:
  • +1 Henk 'm!

  • q-enf0rcer.1
  • Registratie: Maart 2009
  • Laatst online: 00:00
Vaudtje schreef op vrijdag 8 december 2017 @ 17:11:
[...]

Als je daadwerkelijk aan het werken bent met key/value pairs, zou je zelfs je output datastructuur daarop kunnen aanpassen als dat mogelijk is:
JSON:
1
2
3
4
5
{ 
        "piet": "aaa111",
        "jan": "ccc333",
        "henk":"fff555"
}
Dan kom je uit op zoiets:

code:
1
2
3
4
5
6
var filtered = unfiltered.reduce(function(all,item){
  if(all.hasOwnProperty(item.foo) === false){ // nodig omdat we anders de laatste unieke waarde als output krijgen, ipv de eerste
    all[item.foo] = item.doo;
  }
  return all;
},{});


Of als de volgorde je niet uitmaakt van de resultaten:

code:
1
2
3
4
var filtered = unfilteredArray.reduceRight(function(all,item){
  all[item.foo] = item.doo;
  return all;
},{});


Naar mijn mening veel beter leesbaar ;)

[ Voor 20% gewijzigd door q-enf0rcer.1 op 09-12-2017 16:14 ]


Acties:
  • +1 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

q-enf0rcer.1:
(..)
Of als de volgorde je niet uitmaakt van de resultaten:
(...)
Als je een object gebruikt om je resultaten in op te slaan is de volgorde sowieso niet meer van belang, want de volgorde van de keys (of beter gezegd, properties) is ongedefinieerd, en in de praktijk afhankelijk van de engine.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Ramon
  • Registratie: Juli 2000
  • Laatst online: 21:57
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var array = [
    {
        "foo": "piet",
        "doo": "aaa111"
    },
    {
        "foo": "piet",
        "doo": "bbb222"
    },
    {
        "foo": "jan",
        "doo": "ccc333"
    },
    {
        "foo": "henk",
        "doo": "ddd444"
    },
    {
        "foo": "henk",
        "doo": "fff555"
    }
];

var newarray = array.filter((item, index, self) => self.findIndex((t) => t.foo === item.foo) === index)

console.log(newarray)


Zie https://jsfiddle.net/97oj0zme/

Check mijn V&A ads: https://tweakers.net/aanbod/user/9258/


Acties:
  • 0 Henk 'm!

  • jorikdelaporik
  • Registratie: Mei 2013
  • Laatst online: 13-04-2023
Ramon schreef op zondag 10 december 2017 @ 14:34:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var array = [
    {
        "foo": "piet",
        "doo": "aaa111"
    },
    {
        "foo": "piet",
        "doo": "bbb222"
    },
    {
        "foo": "jan",
        "doo": "ccc333"
    },
    {
        "foo": "henk",
        "doo": "ddd444"
    },
    {
        "foo": "henk",
        "doo": "fff555"
    }
];

var newarray = array.filter((item, index, self) => self.findIndex((t) => t.foo === item.foo) === index)

console.log(newarray)


Zie https://jsfiddle.net/97oj0zme/
Let wel op dat dit O(n2) is door gebruik van findIndex (net als indexOf), niet optimaal.

Acties:
  • 0 Henk 'm!

  • q-enf0rcer.1
  • Registratie: Maart 2009
  • Laatst online: 00:00
drm schreef op zondag 10 december 2017 @ 13:41:
[...]
Als je een object gebruikt om je resultaten in op te slaan is de volgorde sowieso niet meer van belang, want de volgorde van de keys (of beter gezegd, properties) is ongedefinieerd, en in de praktijk afhankelijk van de engine.
Dat is een goed punt inderdaad :+

Acties:
  • 0 Henk 'm!

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
JavaScript:
1
const filtered = _.uniqBy(unfiltered, 'foo')


Werkend voorbeeld op CodePen

Met behulp van Lodash. O-)
Pagina: 1