2016-04-18 6 views
2

Ich habe eine Reihe von Elementen im Array. In jedem Element befinden sich mehrere Objekte.Wenn Duplikate in Array gefunden, müssen Sie den Index mit Schlüssel von reinem Javascript hinzufügen

Wenn wir gefunden haben, duplizierte Elemente basierend auf bestimmten Objekt, haben Index

für Ex mit diesem Schlüssel-Objekt hinzuzufügen:

var values = [ 
    { name: 'someName' }, 
    { name: 'someName' }, 
    { name: 'some' }, 
    { name: 'some' }, 
    { name: 'single' } 
]; 

Es würde als

var values = [ 
     { name: 'someName' }, 
     { name: 'someName1' }, 
     { name: 'some' }, 
     { name: 'some1' }, 
     { name: 'single' } 
    ]; 

Wie kann Ich schreibe eine Logik dafür in reinem Javascript (keine jQuery)

https://jsfiddle.net/MohaideenIsmail/kr88up0m/1/

+0

Haben Sie etwas versucht? – Rayon

+0

Ich habe in jsfiddle hinzugefügt, konnte aber keine Logik bekommen – Mohaideen

+0

Hinzugefügt jsfiddle in einem Beitrag – Mohaideen

Antwort

1

Eine Lösung mit thisArgs von Array#forEach() als temporäres Objekt für die Zählung zu halten.

var values = [{ name: 'someName' }, { name: 'someName' }, { name: 'some' }, { name: 'some' }, { name: 'single' }]; 
 

 
values.forEach(function (a) { 
 
    if (!this[a.name]) { 
 
     this[a.name] = { count: 0 }; 
 
     return; 
 
    } 
 
    a.name += ++this[a.name].count; 
 
}, Object.create(null)); 
 

 
document.write('<pre>' + JSON.stringify(values, 0, 4) + '</pre>');

0

Die Frage und das Beispiel sind nicht sehr inline.

Wenn wir gefunden haben, duplizierte Elemente basierend auf bestimmtes Objekt, haben Index hinzugefügt werden mit diesem Schlüssel Objekt

Aus dem obigen Satz, was ich verstehe, ist, wenn wir ein Duplikat, entweder eine der finden Folgemaßnahmen müssen durchgeführt werden. Da es auch nicht klar ist, was passiert, wenn mehrere Duplikate existieren, behandelt der Code alle vorhandenen Duplikate.

1. Der Indexwert des ersten wird zum Nameneigenschaftswert des doppelten Objekts hinzugefügt.

var values = [ 
 
       { name: 'someName' }, 
 
       { name: 'someName' }, 
 
       { name: 'some'  }, 
 
       { name: 'some'  }, 
 
       { name: 'single' }, 
 
       { name: 'someName' }, 
 
       { name: 'some'  } 
 
      ], 
 
    redIx = values.reduce((p,c,i) => { !!p[c.name] ? p[c.name].push(i) : (p[c.name] = [], p[c.name].push(i)) 
 
             return p 
 
             },{});console.log(redIx) 
 
Object.keys(redIx).forEach(e => redIx[e].forEach((i,j) => j>0 && (values[i].name += redIx[e][0]))); 
 
document.write('<pre>' + JSON.stringify(values, 0, 2) + '</pre>');

2. Die eigene Indexwert des Duplikat hinzugefügt werden, um es Name Eigenschaft Wert.

var values = [ 
 
       { name: 'someName' }, 
 
       { name: 'someName' }, 
 
       { name: 'some'  }, 
 
       { name: 'some'  }, 
 
       { name: 'single' }, 
 
       { name: 'someName' }, 
 
       { name: 'some'  } 
 
      ], 
 
     redIx = values.reduce((p,c,i) => { !!p[c.name] ? p[c.name].push(i) : p[c.name] = []; 
 
             return p 
 
             },{}); 
 
Object.keys(redIx).forEach(e => redIx[e].forEach(i => values[i].name += i)); 
 
document.write('<pre>' + JSON.stringify(values, 0, 2) + '</pre>');

3. "1" Zeichen wird auf die doppelte Objektnamen Eigenschaftswert wie in dem gezeigten Beispiel hinzugefügt werden.

var values = [ 
 
    \t  { name: 'someName' }, 
 
       { name: 'someName' }, 
 
       { name: 'some'  }, 
 
       { name: 'some'  }, 
 
       { name: 'single' }, 
 
       { name: 'someName' }, 
 
       { name: 'some'  } 
 
      ], 
 
    redIx = values.reduce((p,c,i) => { !!p[c.name] ? p[c.name].push(i) : p[c.name] = []; 
 
             return p 
 
             },{}); 
 
Object.keys(redIx).forEach(e => redIx[e].forEach(i => values[i].name += "1")); 
 
document.write('<pre>' + JSON.stringify(values, 0, 2) + '</pre>');

Verwandte Themen