J'essaie d'utiliser réduire avec TypeScript pour atteindre un nombre total de messages entrants. Je ne sais pas trop comment ajouter une signature d'index. Je reçois toujours l'erreur: "L'élément a implicitement un type 'any' car le type '{}' n'a pas de signature d'index." sur les variables newArray et count [k]. J'ai lu plusieurs questions similaires, mais je n'ai pas compris comment les appliquer à mon scénario spécifique. Je suis nouveau sur JavaScript et TypeScript.
Voici mon tableau:
var data = [
{ time: '9:54' },
{ time: '9:54' },
{ time: '9:54' },
{ time: '9:55' },
{ time: '9:55' },
{ time: '9:55' },
{ time: '9:55' },
{ time: '9:56' },
{ time: '9:56' },
{ time: '9:56' },
{ time: '9:56' },
{ time: '9:57' },
{ time: '9:57' },
{ time: '9:57' },
{ time: '9:57' },
{ time: '9:57' }
];
Voici comment j'ai besoin de ma matrice pour l'utiliser dans un graphique de recharge:
var dataWithCounts = [
{ time: '9:54', messages: 3 },
{ time: '9:55', messages: 4 },
{ time: '9:56', messages: 4 },
{ time: '9:57', messages: 5 }
];
Avec l'aide de la réponse "Just a Student" de cette question Stack Overflow: Grouper et compter les valeurs dans un tablea , j'ai ce qui suit.
var counts = data.reduce((newArray, item) => {
let time = item.time;
if (!newArray.hasOwnProperty(time)) {
newArray[time] = 0;
}
newArray[time]++;
return newArray;
}, {});
console.log(counts);
var countsExtended = Object.keys(counts).map(k => {
return { time: k, messages: counts[k] };
});
console.log(countsExtended);
Où et comment déclarer une signature d'index? Voici différentes choses que j'ai essayées.
let newArray: { [time: string] };
Et recevez une erreur d'identification en double.
l'ajout d'une chaîne au paramètre var counts = data.reduce((newA:string, item)
me donne une erreur "L'élément a implicitement un type 'any' car l'expression d'index n'est pas de type 'number'."
l'ajout de newA[time].toString()
me donne des erreurs, "Le côté gauche d'une expression d'affectation doit être une variable ou un accès à une propriété."
Si je vous comprends, vous devez créer l'interface pour l'objet ...
interface counts_t{
time?: string,
messages?: number
}
var data: counts_t[] = [
{ time: '9:54' },
{ time: '9:55' },
{ time: '9:56' },
{ time: '9:57' }
];
var counts = data.reduce((newArray:counts_t, item:counts_t) => {
let time = item.time;
if (!newArray.hasOwnProperty(time)) {
newArray[time] = 0;
}
newArray[time]++;
return newArray;
}, {});
console.log(counts);
var countsExtended: counts_t[] = Object.keys(counts).map(k => {
return { time: k, messages: counts[k] };
});
console.log(countsExtended);