0
votes

Comment sélectionner plusieurs propriétés spécifiques avec une valeur distincte à partir de la matrice JavaScript

Supposons que j'ai un tableau JavaScript comme ci-dessous.

  data.map(item=>item.group).


5 commentaires

Stackoverflow n'est pas un service de codage libre. Vous êtes censé Essayez de résoudre le problème Premier . Veuillez mettre à jour votre question pour montrer ce que vous avez déjà essayé dans un exemple de reproductible minimal . Pour plus d'informations, s'il vous plaît voir Comment demander et prendre le Tour :)


Le même groupe a-t-il toujours le même testid? Sinon, devrait-il {groupe: A, Testid: 2} est dans le résultat?


Oui. Même groupe aura toujours le même testid


Créez un objet pour contenir les résultats. Boucle via le tableau, ajout d'un objet avec Groupe et Testid à l'objet de résultat, à l'aide de Groupe comme clé. Lorsque vous avez terminé, les valeurs de l'objet de résultat seront votre ensemble unique.


Stackoverflow.com/questions/18773778 / ...


3 Réponses :


0
votes

Vous pouvez en faire la boucle et obtenir le résultat souhaité.

result = []
data.forEach(x=>{
    if(!result.some(y=>y.group===x.group && x.testid===y.testid)){
        result.push({group:x.group,testid:x.testid});
    }
});


0 commentaires

0
votes

Vous pouvez réduire code> le tableau et vérifier à chaque fois si la paire existe:

const data = [   
    { group: 'A', name: 'SD', testid:1},    
    { group: 'B', name: 'FI',testid:2  },    
    { group: 'A', name: 'MM', testid:1 },   
    { group: 'B', name: 'CO', testid:2 },   
    { group: 'A', name:  'QW',  testid:1 } 
];
let result = data.reduce((prev, el) =>{
    if(prev.some(o => o.group == el.group && o.testid == el.testid))
         return prev;
    return [...prev, {group:el.group, testid:el.testid}]
}, []);

console.log(result);


5 commentaires

@shakz: Cette réponse peut fonctionner jusqu'à 40 fois plus lent que le plus rapide des suggestions .


@Yevgenglorbunkov, il n'a pas demandé une manière efficace de le faire, vous pouvez donc la même chose dans une sorte de hashmap vérifier à chaque chèque s'il existe l'actuel ou non, mais je ne vois pas pourquoi nous devrions nous soucier de la performance si Il ne l'avait pas demandé


Il ne s'agit pas de la performance en premier lieu, il s'agit de promouvoir des solutions avec des algorithmes optimaux et une mise en œuvre robuste. Ma solution est 40 fois plus rapide non seulement en raison de l'outillage approprié, mais en raison d'un algorithme de sous-sommeil optimal. Donc, votre réponse à pourquoi nous devrions nous en soucier? est 'de laisser les autres utilisateurs qui rencontrent ce fil, et à qui les performances comportent pas souffrir à cause des cycles de processeur gaspillés, juste parce qu'ils étaient suffisamment paresseux de ne pas faire défiler plus loin que la réponse acceptée ».


@Yevgenglorbunkov OH et BTW, si vous mentionnez qu'il peut être 40 fois plus lent, il n'a la même complexité, car g (n) = O (f (n)) -> LM N -> + INF G (N) / C * f (n) = 0, SOOOOOOOOOOO s'il est 40 fois plus lent, signifie que c est 40, et il a donc la même complexité, et si vous voulez que je puisse vous en dire plus sur la complexité des algorithmes


@Yevgengorbunkov pleurer sous votre réponse laidée, vous constaterez que l'efficacité du code n'est pas la seule chose qui compte, et si vous parlez vraiment de différence linéaire dans l'algorithme de JS, vous avez probablement oublié que vous parlez déjà dans une langue qui est 10 fois plus lent que beaucoup d'autres, et vous êtes absolument libre de développer ce code dans Web Assembly afin que votre code puisse être encore plus plus achalandé mais plus rapide, passez une bonne journée



0
votes

Utilisez foreach code> BOOP et construire un objet avec des touches comme uniq_id. Après la traverse, retournez objet.values ​​ code> de l'objet ci-dessus.

p>

const convert = (arr) => {
  const res = {};
  arr.forEach(({group, testid}) => {
    // change uniq_id based on requirement
    const uniq_id = `${group}-${testid}`;
    res[uniq_id] = { group, testid};
  });
  return Object.values(res);
}

const data = [   
    { group: 'A', name: 'SD', testid:1},    
    { group: 'B', name: 'FI',testid:2  },    
    { group: 'A', name: 'MM', testid:1 },   
    { group: 'B', name: 'CO', testid:2 },   
    { group: 'A', name:  'QW',  testid:1 } 
];

console.log(convert(data));


1 commentaires

Je dirais que l'union d'union est un délimiteur risqué car il pourrait causer {groupe: 'A-B', Testid: 'C'} et {groupe: 'A', Testid: 'B -C '} reconnu comme le même enregistrement de manière inattendue