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?
5 Réponses :
Array#filter
Array#map
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));
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)
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'));
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"));
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'));
Commencez par
filtrer
les objets que vous souhaitez sélectionner, puismappez
les nouveaux objets au format souhaité (avecx
ety < / code> propriétés).