0
votes

Comment utiliser Array.prototype.filter pour filtrer sélectivement les données Json tout en renommant les propriétés de l'objet dans le tableau résultant?

J'ai un Json qui ressemble à ceci

[{x:'2014', y: 34}, {x:'2015', y: 77}]

Je voudrais créer un tableau d'objets (contenant x et y) qui peuvent être filtrés sur une plage d'années (par exemple ans entre 2014 et 2015) pour la propriété x, et la valeur d'une propriété spécifique comme y (par exemple «score»). Par exemple, si je filtre par plage d'années 2014-2015 et par propriété "score", le tableau résultant doit être:

[{x:'2014', y: 705.23}, {x:'2015', y: 467.12}]

Un autre exemple, si je filtre par plage de années 2014-2015 et par la propriété "num_games", le tableau résultant devrait être:

{
    "score": "1200.65",
    "num_games": "160",
    "wins": "110",
    "year": "2013"
},
{
    "score": "705.23",
    "num_games": "34",
    "wins": "21",
    "year": "2014"
},
{
    "score": "467.12",
    "num_games": "77",
    "wins": "30",
    "year": "2015"
},

Comment dois-je procéder? Array.prototype.filter est-il le bon outil pour cela?


1 commentaires

Commencez par filtrer les objets que vous souhaitez sélectionner, puis mappez les nouveaux objets au format souhaité (avec x et y < / code> propriétés).


5 Réponses :


1
votes
  1. Filtrer le tableau en utilisant Array#filter
  2. Convertissez les éléments du tableau en un type de votre choix en utilisant Array#map
  3. var data = [{"score": "1200.65", "num_games": "160", "wins": "110", "year": "2013" }, { "score": "705.23", "num_games": "34", "wins": "21", "year": "2014" }, { "score": "467.12", "num_games": "77", "wins": "30", "year": "2015" }];
    
    function getFilteredData(data, start, end) {
      return data.reduce(function(result, item) {
        if (+start <= +item.year && +item.year <= +end) result.push({
          x: item.year,
          y: item.score
        });
        return result;
      }, []);
    }
    
    console.log(getFilteredData(data, 2014, 2017));

    Si vos dates sont dans des limites raisonnables, vous n'avez pas à convertir l'année en un nombre , mais les années à 3 ou 5 chiffres et plus ne filtreront pas correctement, sauf si vous convertissez les années aux nombres.

    Si vous voulez une version plus abstraite de la fonction, vous pouvez faire:

    var data = [{"score": "1200.65", "num_games": "160", "wins": "110", "year": "2013" }, { "score": "705.23", "num_games": "34", "wins": "21", "year": "2014" }, { "score": "467.12", "num_games": "77", "wins": "30", "year": "2015" }];
    
    function getFilteredData(data, filterOptions, mapOptions) {
      return data.filter(function(item) {
        return Object.keys(filterOptions).every(function(key) {
          var option = filterOptions[key];
          if (+option.min <= +item[key] && +item[key] <= +option.max) return true;
        });
      }).map(function(item) {
        return Object.keys(mapOptions).reduce(function(result, key) {
          var option = mapOptions[key];
          result[key] = item[option];
          return result;
        }, {});
      });
    }
    
    function registerFilter(filterOptions, mapOptions) {
      return function(data) {
        return getFilteredData(data, filterOptions, mapOptions);
      };
    }
    
    var customFilter = registerFilter(
      { year: { min: 2014, max: 2015 },
      { x: "year", y: "score" }
    );
    
    console.log(customFilter(data));

    Vous pouvez effectuer les deux opérations ensemble en utilisant une boucle for ou Array # reduction . Ce qui rend le code plus rapide mais moins maintenable.

    var data = [{"score": "1200.65", "num_games": "160", "wins": "110", "year": "2013" }, { "score": "705.23", "num_games": "34", "wins": "21", "year": "2014" }, { "score": "467.12", "num_games": "77", "wins": "30", "year": "2015" }];
    
    function getFilteredData(data, start, end) {
      return data.filter(function(item) {
        return +start <= +item.year && +item.year <= +end;
      }).map(function(item) {
        return {
          x: item.year,
          y: item.score
        };
      });
    }
    
    console.log(getFilteredData(data, 2014, 2017));

0 commentaires

0
votes

Le filtre, la carte et la destruction d'objets peuvent faire le travail:

const y = [{
    "score": "1200.65",
    "num_games": "160",
    "wins": "110",
    "year": "2013"
  },
  {
    "score": "705.23",
    "num_games": "34",
    "wins": "21",
    "year": "2014"
  },
  {
    "score": "467.12",
    "num_games": "77",
    "wins": "30",
    "year": "2015"
  }
];


const res = y.filter(o => o.year == 2014).map(({
  year: x,
  score: y
}) => ({
  x,
  y
}))

console.log(res)


0 commentaires

0
votes

Commencez par filtrer le tableau par dates, puis mappez les éléments filtrés au format requis. Vous pouvez utiliser la déstructuration pour raccourcir le code:

const data = [{
    "score": "1200.65",
    "num_games": "160",
    "wins": "110",
    "year": "2013"
}, {
    "score": "705.23",
    "num_games": "34",
    "wins": "21",
    "year": "2014"
}, {
    "score": "467.12",
    "num_games": "77",
    "wins": "30",
    "year": "2015"
}];

const filterBy = (data, [min, max], prop) => data
  .filter(({ year }) => year >= min && year <= max)
  .map(({ year: x, [prop]: y }) => ({ x, y }));

console.log(filterBy(data, [2013, 2014], 'score'));
console.log(filterBy(data, [2013, 2013], 'wins'));


0 commentaires

0
votes

Vous pouvez utiliser . filtre pour obtenir les objets dans votre plage requise, puis utilisez .map pour créer les objets à partir de la liste filtrée.

Voir l'exemple ci-dessous:

p >

const arr = [{
    "score": "1200.65",
    "num_games": "160",
    "wins": "110",
    "year": "2013"
},
{
    "score": "705.23",
    "num_games": "34",
    "wins": "21",
    "year": "2014"
},
{
    "score": "467.12",
    "num_games": "77",
    "wins": "30",
    "year": "2015"
}];

const get_items = (arr, [sY, eY], prop) => 
   arr
    .filter(({year}) => +sY <= year && year <= +eY)
    .map(({year:x, ...rest}) => ({x, y: rest[prop]}));


console.log(get_items(arr, ["2014", "2015"], "score"));


0 commentaires

0
votes

Vous pouvez filtrer et mapper les valeurs souhaitées.

.as-console-wrapper { max-height: 100% !important; top: 0; }
function getParts(array, [min, max], key) {
    return array
        .filter(({ year }) => +min <= year && year <= +max)
        .map(({ year: x, [key]: y }) => ({ x, y }));
}

var data = [{ score: "1200.65", num_games: "160", wins: "110", year: "2013" }, { score: "705.23", num_games: "34", wins: "21", year: "2014" }, { score: "467.12", num_games: "77", wins: "30", year: "2015" }];

console.log(getParts(data, [2014, 2015], 'score'));
console.log(getParts(data, [2014, 2015], 'num_games'));


0 commentaires