3
votes

Obtenez un maximum de valeurs de clé supérieures avec l'objet du tableau

Je veux la clé maximale d'un objet dans un tableau en Javascript, voici l'exemple d'un tableau de JSON. J'ai essayé avec la fonction Reduce () ES6, mais elle ne reviendra que sur enregistrement, alors aidez-moi à obtenir le maximum de non. du tableau de clés, je fournit également la sortie de ce que je veux, ce sera génial si la solution dans les fonctions d'ordre élevé (ES6)

let data = myArray.reduce(function(prev, curr) {
    return prev.key > curr.key ? prev : curr;
});

J'ai essayé avec la fonction de réduction mais n'obtient qu'un seul enregistrement p >

let arr = [{
                key : 1,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 1,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 2,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 2,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 2,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 3,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 3,
                name : 'testaa',
                dept : 'ggg'
            }]

 output i want maximum key of array:


    arr = [{
                key : 3,
                name : 'testaa',
                dept : 'ggg'
            }, {
                key : 3,
                name : 'testaa',
                dept : 'ggg'
            }]


3 commentaires

{key = 1, name = 'testaa', dept = 'ggg'} n'est pas une syntaxe valide = doit être :


Réduire ne retournera qu'une seule valeur ..... et vous ne définissez pas le réducteur avec une valeur par défaut pour démarrer ....


Vous dites que vous voulez la clé maximale. Votre appel de réduction renvoie la touche maximale. Alors que voulez-vous d'autre (quand vous dites "un seul")?


4 Réponses :


3
votes

Vous ne renvoyiez que la dernière clé supérieure. Vous devez construire un tableau contenant tous les éléments qui ont la clé la plus élevée.

Dans mon algorithme, je stocke la clé la plus élevée dans un tableau, lorsque je rencontre un élément avec une clé plus élevée que les éléments que j'ai stockés, je fouette le tableau et recréez-en un.

const arr = [{
  key: 1,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 1,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 2,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 2,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 2,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 3,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 3,
  name: 'testaa',
  dept: 'ggg'
}];

const higherKey = arr.reduce((tmp, x) => {
  if (!tmp.length || tmp[0].key < x.key) {
    return [x];
  }

  if (tmp[0].key === x.key) {
    tmp.push(x);
  }

  return tmp;
}, []);

console.log(higherKey);


0 commentaires

4
votes

Vous pouvez le faire en deux étapes:

  1. Trouvez la valeur la plus élevée en utilisant Math.max
  2. Filtrez votre tableau avec cette valeur à l'aide de .filter ()

let arr = [{
  key: 1,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 1,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 2,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 2,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 2,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 3,
  name: 'testaa',
  dept: 'ggg'
}, {
  key: 3,
  name: 'testaa',
  dept: 'ggg'
}];

let max = Math.max(...arr.map(item => item.key));

console.log(arr.filter(item => item.key === max));


2 commentaires

Merci Serge K pour la solution, je suis d'accord avec votre solution mais, vous itérez deux fois une pour map () et une autre pour filter (), nous pouvons le faire en fonction reduction () une seule itération.


@sarveshkumar Voir la réponse de Gregory NEUT



0
votes
let arr = [{
    key : 1,
    name : 'testaa',
    dept : 'ggg'
}, {
    key : 1,
    name : 'testaa',
    dept : 'ggg'
}, {
    key : 3,
    name : 'testaa',
    dept : 'ggg'
}, {
    key : 2,
    name : 'testaa',
    dept : 'ggg'
}, {
    key : 2,
    name : 'testaa',
    dept : 'ggg'
}, {
    key : 8,
    name : 'testaa',
    dept : 'ggg'
}, {
    key : 3,
    name : 'testaa',
    dept : 'ggg'
}]
let max = arr[0];
let data = arr.forEach(function(curr,index) {
if(max.key < curr.key) {
max = curr;
}
});
result = arr.map((item) => {
return item.key === map.key;
});
console.log(result)
I would suggest to use two loops one for finding out the max key and then filter those keys, complexity would be o(n)

0 commentaires

0
votes

Si vous souhaitez utiliser réduire , en une seule itération, vous pouvez l'utiliser comme ça (c'est vraiment verbeux, vous pouvez simplifier si vous le souhaitez):

let data = arr.reduce(function(acc, curr) {
    // If there is not data on the accumulator, add the first element
    if (acc.length === 0) {
        acc.push(curr);
        return acc;
    }
    // if current key is smaller than the stored one, clear and start a new accumulator
    if (acc[0].key < curr.key) {
        acc = [];
        acc.push(curr);
    }
    // If key is the same than the stored one, add it to the accumulator
    else if(acc[0].key === curr.key) {
        acc.push(curr);
    }

    // Return the accumulator
    return acc;
}, []);


0 commentaires