Reputation: 93
After finding out that sorting objects is not possible - even though I need the values of the objects sorted - I believe that I have to push the content of the object array to an array for sorting.
My code below produces this output without implementing any send to an array function:
This is my code:
var aveArr = {};
var length = 0;
var q = d3.queue();
['csv goes here', 'another csv goes here'].map((c) => {
q.defer(d3.csv, c);
length += 1;
});
q.awaitAll(function(d, csvs){
var selection = d3.merge(csvs);
selection.map((d,i) => {
aveArr[d.word] = {
sum: 0,
average: 0,
};
var obj = aveArr[d.word];
obj.sum += +d.frequency;
obj.average = obj.sum / length;
});
console.log(aveArr);
});
I only need the word and average to be displayed in the console, then for the averages to be sorted.
I've found this for pushing content to arrays, but for me, it doesn't work.
Upvotes: 1
Views: 127
Reputation: 3682
Do you want to keep your object structure?
const aveArr = {
'0': { sum: 0, average: 0 },
'001': { sum: 0, average: 0 },
'00': { sum: 1, average: 0.5 },
'01': { sum: 0, average: 0 },
'1': { sum: 11, average: 5.5 },
'1am': { sum: 0, average: 0 },
'1pickford': { sum: 0, average: 0 },
'1pm': { sum: 0, average: 0 },
'1pm': { sum: 0, average: 0 },
'1st': { sum: 3, average: 1.5 },
'1x': { sum: 2, average: 1 },
'1xbet': { sum: 0, average: 0 }
};
const transformed = Object
.keys(aveArr).map(key => ({ name: key, average: aveArr[key].average }));
const sorted = transformed.sort((left, right) => left.average - right.average);
console.log(sorted);
Upvotes: 1
Reputation: 8589
At the moment you're using the 'array' as an object by setting keys on it. I would advice to change the data structure so it's a real array with fixed fields. Then sorting and transforming becomes very easy:
// source data
const data = [
{ name: "0", sum: 0, average: 0 },
{ name: "001", sum: 0, average: 0 },
{ name: "00", sum: 1, average: 0.5 },
{ name: "01", sum: 0, average: 0 },
{ name: "1", sum: 11, average: 5.5 },
{ name: "1am", sum: 0, average: 0 },
{ name: "1pickford", sum: 0, average: 0 },
{ name: "1pm", sum: 0, average: 0 },
{ name: "1pm2", sum: 0, average: 0 },
{ name: "1st", sum: 3, average: 1.5 },
{ name: "1x", sum: 2, average: 1 },
{ name: "1xbet", sum: 0, average: 0 }
];
const transformed = data
// we only want the name and average
.map(({ name, sum, average }) => ({ name, average }))
// sort by average
.sort(( a, b ) => a.average - b.average );
console.log( transformed );
Upvotes: 2