user10230515
user10230515

Reputation: 93

Pushing an array of objects to an array for sorting

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:

enter image description here

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

Answers (2)

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

Shilly
Shilly

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

Related Questions