Ich versuche, im Array vorhandene Duplikate zu entfernen. Doppelte IDs sollten entfernt werden, wobei die maximale Anzahl beibehalten wird. Zum Beispiel -

Mein Objekt enthält folgende Eigenschaften:

[{
    "id": 2,
    "count": 10
}, {
    "id": 3,
    "count": 3
}, {
    "id": 4,
    "count": 6
}, {
    "id": "2",
    "count": 15
},{
    "id": "2",
    "count": 12
}]

Erläuterung: ID: 2 ist doppelt vorhanden, daher muss ID: 2 mit der Zählung 10 und 12 entfernt werden. Ich muss die ID mit der maximalen Anzahl beibehalten.

Ich habe keine ähnliche Frage gefunden und konnte sie daher nicht lösen. Ich bin ein Anfänger in js, daher wären Kommentare im Code willkommen.

0
Rahul Vighne 8 Feb. 2020 im 10:26

5 Antworten

Beste Antwort

Durchlaufen Sie einfach jeden Wert und bewerten Sie, ob es das Maximum in Ihrer akkumulierten Sammlung ist:

let unique_set = {}
let arr = [{
  "id": 2,
  "count": 10
}, {
  "id": 3,
  "count": 3
}, {
  "id": 4,
  "count": 6
}, {
  "id": "2",
  "count": 15
}, {
  "id": "2",
  "count": 12
}]

arr.forEach(obj => {
  if (obj.id in unique_set) {
    if (unique_set[obj.id].count <= obj.count)
      unique_set[obj.id] = obj;  // update
  } 
  else
    unique_set[obj.id] = obj;    // create
});

console.log(Object.values(unique_set))
-1
Mike 8 Feb. 2020 im 07:38

Die Verwendung von reduce und Object.values wird vereinfacht

const update = data =>
  Object.values(
    data.reduce(
      (acc, curr) => (
        (acc[curr.id] =
          curr.id in acc
            ? { ...acc[curr.id], count: Math.max(acc[curr.id].count, curr.count) }
            : { ...curr }),
        acc
      ),
      {}
    )
  );

const data = [
  {
    id: 2,
    count: 10
  },
  {
    id: 3,
    count: 3
  },
  {
    id: 4,
    count: 6
  },
  {
    id: "2",
    count: 15
  },
  {
    id: "2",
    count: 12
  }
];

console.log(update(data));
0
Siva Kondapi Venkata 8 Feb. 2020 im 09:32

Wenn Sie Javascript-Bibliotheken wie Unterstrich oder lodash verwenden können, empfehle ich einen Blick auf die Funktion _.uniq in ihren Bibliotheken. Von lodash:

    _.uniq(array, [isSorted=false], [callback=_.identity], [thisArg])

Grundsätzlich übergeben Sie das Array, das hier ein Objektliteral ist, und Sie übergeben das Attribut, mit dem Sie Duplikate im ursprünglichen Datenarray entfernen möchten, wie folgt:

    var array = [{'name': 'Hashim', 'surname': 'Mirza'}, {'name': 'Qasim', 'surname': 'Mirza'}];
    var non_duplidated_array = _.uniq(array, 'name'); 

UPDATE: Lodash hat jetzt auch eine .uniqBy eingeführt.

0
Muhammad Hashim 8 Feb. 2020 im 07:55
const source = [{
    "id": 2,
    "count": 10
}, {
    "id": 3,
    "count": 3
}, {
    "id": 4,
    "count": 6
}, {
    "id": "2",
    "count": 15
},{
    "id": "2",
    "count": 12
}]
let result = []

source.forEach(sourceItem => {
    let found = false
    result.forEach(resultItem => {
        if (resultItem.id == sourceItem.id) {
            resultItem.count = Math.max(resultItem.count, sourceItem.count)
            found = true
        }
    })
    if (!found) {
        result.push(sourceItem)
    }
})

console.log(result)
-1
Sergey 8 Feb. 2020 im 08:52

Sie müssen nicht das gesamte Array durchlaufen, sondern können das Ergebnis mithilfe des folgenden Codeausschnitts abrufen:

var obj = [{
    "id": 2,
    "count": 10
}, {
    "id": 3,
    "count": 3
}, {
    "id": 4,
    "count": 6
}, {
    "id": "2",
    "count": 15
},{
    "id": "2",
    "count": 12
}];

let max = Math.max.apply(Math,obj.map(function(o){ return o.id == 2
&& o.count;}));

let result = obj.filter(function(o){
    return !(o.id == 2 && o.count != max);
});
console.log(result);

[prüfen Sie

var obj = [{
    "id": 2,
    "count": 10
}, {
    "id": 3,
    "count": 3
}, {
    "id": 4,
    "count": 6
}, {
    "id": "2",
    "count": 15
},{
    "id": "2",
    "count": 12
}];

let max = Math.max.apply(Math,obj.map(function(o){ return o.id == 2
&& o.count;}));

let result = obj.filter(function(o){
	return !(o.id == 2 && o.count != max);
});
console.log(result);

] 1

-1
Pramod Singh 8 Feb. 2020 im 09:08