9
votes

Comment supprimer des objets inégalés de la matrice d'objets à l'aide de JavaScript ou de Lodash

Je reçois deux gares d'objets du serveur comme ceci:

for(var j=0;j < duplicateTestData.length;j++){
    for (var i = 0; i < finalResult.length; i++) {
        if (
            (finalResult[i].licenseId == duplicateTestData[j].licenseId)  && 
            (finalResult[i].reportDate == duplicateTestData[j].reportDate) &&
            (finalResult[i].batchId == duplicateTestData[j].batchId)
        ) {
            finalResult.splice(i, 1);
            break;
        }
    }
}

console.log(finalResult);


6 commentaires

Qu'est-ce qui constitue un match?


@naomik j'essaie de faire correspondre toutes les propriétés du premier objet avec les deuxième propriétés d'objet.


Je mets votre code dans un violon chez jsfiddle.net/kjdx6e4o semble aller pour moi. Ai-je oublié quelque chose?


@Dhananjay Le violon fonctionne. Je ne comprends pas quel est le problème


@Dhananjay Je reçois ces deux objets du serveur. J'ai vu votre code que vous mettez la date du rapport en guillemets simples. Mais le résultat que je reçois du serveur ne contient pas les guillemets simples de la date du rapport. parce que sa date.


@Jeevan sans les citations, les données ne sont pas valides JSON, peut-être que cela doit être corrigé sur le serveur?


5 Réponses :


6
votes
var res = _.filter(finalResult, function(item) {
  return !_.find(duplicateTestData, {
    batchId: item.batchId,
    licenseId: item.licenseId,
    reportDate: item.reportDate
  });
});
console.log(res);
jsfiddle

1 commentaires

bonne solution pour les utilisateurs de Lodash +1 - Je pourrais recommander _. Rechercher (...) === indéfini au lieu de ! ._ trouver (...) juste pour être plus explicite.



5
votes

Vous pouvez utiliser une table de hachage et renvoyer un nouveau jeu de résultats, sans que le problème de l'épissage d'un tableau tout en itération de celui-ci.

p>

function getKey(o) {
    return o.licenseId + '|' + o.reportDate + '|' + o.batchId;
}

var duplicateTestData = [{ licenseId: 'xxx', batchId: '123', reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)' }, { licenseId: 'yyy', batchId: '124', reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)' }, { licenseId: 'aaa', batchId: '145', reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)' }],
    finalResult = [{ reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)', license: {}, testType: 'P1', productType: 'Flower', batchId: '123', licenseId: 'xxx', createType: 'DataUpload' }, { reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)', testType: 'P1', productType: 'Flower', batchId: '124', licenseId: 'yyy', createType: 'DataUpload' }, { reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)', testType: 'P1', productType: 'Flower', batchId: '145', licenseId: 'aaa', createType: 'DataUpload' }, { reportDate: 'Fri Dec 14 2015 00:00:00 GMT+0530 (India Standard Time)', testType: 'P1', productType: 'Flower', batchId: '145', licenseId: 'zzz', createType: 'DataUpload' }],
    map = duplicateTestData.reduce((r, a) => r.set(getKey(a)), new Map),
    result = finalResult.filter(a => !map.has(getKey(a)));

console.log(result);


3 commentaires

Pourquoi ne pas utiliser de carte , au moins dans la solution ES6?


(r.set (getkey (a)), r) simplifie à r.set (getkey (a)) faisant la carte un meilleur choix ^ _ ^


Je ne connaissais pas le retour de l'objet. Merci encore.



8
votes

Le moyen facile de sortir xxx pré>

ok, Ça fonctionne em>, mais c'est la plupart des ordures. Cela ne décrit pas complètement et avec précision la comparaison que vous essayez de faire. C'est trop spécifique et il va se casser dès que quelque chose à propos de vos modifications de données. p>

continue à lire et nous pouvons apprendre quelque chose de plaisir. p>


égalité d'objet pour tous (clés et valeurs) ... h3>

Je commencerais en faisant plusieurs génériques Les procédures que nous pouvons utiliser pour mieux décrire la solution à notre problème. P>

Ce que vous remarquerez à propos de cette solution par rapport aux autres, c'est qu'elle ne fait aucune hypothèse sur les internes de vos données. Cette solution ne pouvait pas s'en soucier de moins sur les noms de clés réels utilisés dans vos objets. P>

Cela signifie que nous ne toucherons aucun Batchid code>, licimitéID code> , ou repordate code>. Les procédures génériques peuvent tout résoudre dans ce cas et la meilleure partie à ce sujet, vous pouvez les utiliser à nouveau sur toutes les données que vous souhaitez traiter. P>

p>

// arrayCompare :: (a -> b -> Bool) -> [a] -> [b] -> Bool
const arrayCompare = f=> ([x,...xs])=> ([y,...ys])=> {
  if (x === undefined && y === undefined)
    return true
  else if (! f (x) (y))
    return false
  else
    return arrayCompare (f) (xs) (ys)
}

// keys :: Object(k:v) -> [k]
const keys = Object.keys

// objectCompare :: (v -> v -> Bool) -> Object(k:v) -> Object(k:v) -> Bool
const objectCompare = f=> a=> b=>
  arrayCompare (x=> y=> f (a[x]) (b[x]) && f (a[y]) (b[y])) (keys(a)) (keys(b))

// objectEqual :: Object -> Object -> Bool
const objectEqual = objectCompare (x=> y=> x === y)

// subsetObjectEquals :: Object -> Object -> Bool
const subsetObjectEquals = objectCompare (x=> y=> y === undefined || x === y)

// your data
var duplicateTestData = [{ licenseId: 'xxx',
    batchId: '123',
    reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)' },
  { licenseId: 'yyy',
    batchId: '124',
    reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)' },
  { licenseId: 'aaa',
    batchId: '145',
    reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)' }
  ];

var finalResult = [ { reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)',
    license: {},
    testType: 'P1',
    productType: 'Flower',
    batchId: '123',
    licenseId: 'xxx',
    createType: 'DataUpload' },
    { reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)',
    testType: 'P1',
    productType: 'Flower',
    batchId: '124',
    licenseId: 'yyy',
    createType: 'DataUpload' },
    { reportDate: 'Fri Dec 11 2015 00:00:00 GMT+0530 (India Standard Time)',
    testType: 'P1',
    productType: 'Flower',
    batchId: '145',
    licenseId: 'aaa',
    createType: 'DataUpload' },
    { reportDate: 'Fri Dec 14 2015 00:00:00 GMT+0530 (India Standard Time)',
    testType: 'P1',
    productType: 'Flower',
    batchId: '145',
    licenseId: 'zzz',
    createType: 'DataUpload' }               
]

// get all finalResult items that do not subsetObjectEqual items in duplicateTestData
var result = finalResult.filter(x=>
  duplicateTestData.find(subsetObjectEquals(x)) === undefined)

console.log(result)


2 commentaires

Merci à @naomik pour votre temps, et cela m'a beaucoup aidé à comprendre tout le problème. Merci beaucoup


@Jeevan tu es vraiment le bienvenu. Assurez-vous de me faire savoir si vous avez des questions.



2
votes
for (var a = 0; a < duplicateTestData.length; a++) {
  var dt = duplicateTestData[a];
  var dtr = new Date(dt.reportDate + '');

  for (var b = 0; b < finalResult.length; b++) {
    var fr = finalResult[b];
    var frr = new Date(fr.reportDate + '');

    //define your logic how to match two objects
    if (dtr.getTime() !== frr.getTime() &&
      dt.batchId !== fr.batchId) {
      //object matched. remove it from array

      var removed = finalResult.splice(b, 1);
      console.log('items removed', removed);
    }
  }
}

//print finalResult array
for (var c = 0; c < finalResult.length; c++) {
  console.log(finalResult[c]);
}

0 commentaires

1
votes

Utilisation de Lodash:

<script src="https://cdn.jsdelivr.net/lodash/4.15.0/lodash.min.js"></script>


0 commentaires