1
votes

Recherche de valeurs en double à différents niveaux d'un objet JSON multidimensionnel dans JavaScript

J'ai un objet JSON (stringifié) getResponse ["taskData"] comme exemple:

var countSameStart = {};
getResponse["taskData"].forEach(function (x) {
    countSameStart[x] = ( countSameStart[x] || 0 ) + 1;
});

Ce dont j'ai besoin, c'est de savoir combien de doublons des valeurs startOn à différents niveaux de l'objet multidimensionnel.

Par exemple, obtenir 30-4-2019-18-0 (2), 1-5-2019-16-30 (2) en conséquence me serait utile. Ou, obtenir les entiers d'index des doublons correspondants serait également utile.

J'ai essayé de réaliser une telle fonction en utilisant ceci:

[
   {title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"},
   {title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"},
   {title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"},
   {title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"},
   {title: "zxcvbn", startOn: "2-5-2019-9-0", endOn: "2-5-2019-11-0"}
]

Mais, alors J'ai compris que cette fonction était incapable d'accéder à différents niveaux de l'objet et de comparer ces valeurs. De plus, je n'arrivais pas à comprendre.

J'apprécie toute réponse constructive sous forme de code ou de recommandation.


9 commentaires

qu'entendez-vous par "différents niveaux de l'objet" ?


Double possible de Comment trouver des valeurs en double dans un tableau d'objets JavaScript et générer uniquement des valeurs uniques?


Ce que vous avez montré est un tableau d'objets dont les valeurs sont toutes des chaînes. Si vous écrivez console.log (x) à l'intérieur de forEach, vous pouvez voir à quoi vous avez affaire.


@NinaScholz J'ai essayé d'expliquer en comparant getResponse ["taskData"] [i] [1] et en construisant un tableau comprenant les résultats comme indiqué.


ce serait plus facile si vous ajoutez un objet stringifié (JSON) (au lieu d'une copie de console) à la question. il n'a pas toutes les lignes ou propriétés, mais nous devons avoir une idée de l'objet dont vous parlez.


@NinaScholz J'ai mis à jour cette partie, merci.


@RadonirinaMaminiaina J'ai vérifié votre suggestion, mais elle n'avait pas la réponse que je cherchais. Les similitudes que j'ai vues concernaient la détection des doublons, mais plus simple.


en fait, je ne vois pas d'objets ou de tableaux imbriqués, juste un seul tableau d'objets. qu'est-ce qui ne fonctionne pas exactement avec votre code?


@NinaScholz Le problème était que le tableau getResponse a également d'autres versions de ce groupe d'objets. J'avais besoin de trouver un moyen sans diviser le tableau, en créant plutôt un nouveau tableau de résultats afin que je puisse également pousser un autre ensemble de résultats de l'autre partie du tableau.


3 Réponses :


1
votes

Vous pouvez utiliser la réduction de tableau et créer un objet où les clés seront startOn et sa valeur sera un tableau d'objets. Ensuite, vous pouvez prendre cette valeur de clé et utiliser length pour obtenir le nombre d'éléments avec le même startOn

let data = [{
    title: "123456",
    startOn: "30-4-2019-18-0",
    endOn: "30-4-2019-19-0"
  },
  {
    title: "123456",
    startOn: "30-4-2019-18-0",
    endOn: "30-4-2019-19-0"
  },
  {
    title: "qwerty",
    startOn: "1-5-2019-16-30",
    endOn: "1-5-2019-19-0"
  },
  {
    title: "asdfgh",
    startOn: "1-5-2019-16-30",
    endOn: "1-5-2019-19-0"
  },
  {
    title: "zxcvbn",
    startOn: "2-5-2019-9-0",
    endOn: "2-5-2019-11-0"
  }
]

let k = data.reduce(function(acc, curr) {
  if (acc[curr.startOn]) {
    acc[curr.startOn].push(curr)
  } else {
    acc[curr.startOn] = [curr]
  }
  return acc;

}, {});
console.log(k["30-4-2019-18-0"].length)


0 commentaires

2
votes

Vous pouvez créer une fonction qui prend une propriété, c'est-à-dire startOn et value. Utilisez forEach sur le tableau si prop correspond à la valeur donnée, puis transmettez son index à l'objet de résultat.

const arr = [{title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"}, {title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0"}, {title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"}, {title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0"}, {title: "zxcvbn", startOn: "2-5-2019-9-0", endOn: "2-5-2019-11-0"}]
   
function dups(arr,key,val){
  let res = [];
  arr.forEach((x,i) => {
    if(x[key] === val) res.push(i);
  })
  return res;
}

console.log(dups(arr,'startOn','30-4-2019-18-0'))


0 commentaires

1
votes

En supposant que vous ayez un objet avec des tableaux, vous pourriez alors obtenir les valeurs et parcourir les tableaux et obtenir le nombre de clés voulues.

var getResponse = { taskData: [{ title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0" }, { title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0" }, { title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }, { title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }, { title: "zxcvbn", startOn: "2-5-2019-9-0", endOn: "2-5-2019-11-0" }], otherData: [{ title: "123456", startOn: "30-4-2019-18-0", endOn: "30-4-2019-19-0" }, { title: "qwerty", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }, { title: "asdfgh", startOn: "1-5-2019-16-30", endOn: "1-5-2019-19-0" }] },
    key = 'startOn',
    count = Object.values(getResponse).reduce(
        (c, a) => (a.forEach(({ [key]: item }) => c[item] = (c[item] || 0) + 1), c),
        Object.create(null)
    );

console.log(count);


3 commentaires

Veuillez excuser mon manque de connaissances, mais je me demande si j'utilise cet extrait de code, réduirait le changement de fonction de l'objet, ou attribuerais simplement la version modifiée à une variable?


la fonction de réduction change (uniquement) l'accumulateur c , qui commence par un objet vraiment vide (pas de prototypes) et cela est renvoyé comme résultat.


D'accord, j'avais besoin de la clé correspondante, c'est pourquoi j'ai changé cela en réponse acceptée. Je peux également l'utiliser avec les autres couches de l'objet, merci de l'avoir également inclus comme exemple.