0

i have this following Array :

var objRow = [
    {
        2011-09-20 : [0, 100, 0],
        customerID : C1101,
        ANI : 1234
    },
    {
        2011-09-25 : [0, 0, 0],
        customerID : C1101,
        ANI : 1234
    },
    {
        2011-09-20 : [0, 500, 0],
        customerID : C1102,
        ANI : 5678
    },
    {
        2011-09-22 : [0, 0, 50],
        customerID : C1102,
        ANI : 5678
    }
]

I want to create CSV Data from array above. But, i have problem to change that array to this CSV pattern :

1234, C1101, 0, 0, 100, 0, 0, 0
5678, C1102, 0, 0, 500, 0, 0, 50

I try to group the customerID using reduce, and because the first index in every object is date. I have some array of dates :

var dateArr = ["2011-09-20", "2011-09-22", "2011-09-25"];

And this is my code :

var result = objRow.reduce(function(prev, curr, index, arr) {
    var num = curr["customerID"];

    if (!prev[num]) {
        prev[num] = [];
    }

    for (var j = 0; j < dateArr.length; j++) {
        prev[num].push(curr[dateArr[j]]);
    }

    return prev;
}, {});

Update Question For number combination in date index. I use this rules :

[0, 100, 0] // from first Object
[0, 0, 0] // from second Object


fistObject_firstIndex, secondObject_firstIndex, firstObject_secondIndex, secondObject_secondIndex, firstObject_thirdIndex, secondObject_thirdIndex
0, 0, 100, 0, 0, 0

Up, Down, Up, Down, Up, Down...

How to create CSV Pattern above? Thank you...

4
  • I think csv does not supports arrays Commented Oct 14, 2014 at 2:50
  • Why does [0, 100, 0] become 0, 0, 100 in the CSV? What's the logic? Commented Oct 14, 2014 at 2:52
  • @bto.rdz yes i know, therefore i want to convert array above to comma separated. Commented Oct 14, 2014 at 2:52
  • @Ja͢ck the all indexes combined. index-0_object0 , index-0_object1, index-1_object0, index-1_object1 and so on Commented Oct 14, 2014 at 2:55

2 Answers 2

1

I think this will give you the result you want:

var objRow = [{
  date: 2011-09-20,
  nums: [0, 100, 0],
  customerID: "C1101",
  ANI: 1234
}, {
  date: 2011-09-25,
  nums: [0, 0, 0],
  customerID: "C1101",
  ANI: 1234
}, {
  date: 2011-09-20,
  nums: [0, 500, 0],
  customerID: "C1102",
  ANI: 5678
}, {
  date: 2011-09-22,
  nums: [0, 0, 50],
  customerID: "C1102",
  ANI: 5678
}];


//CREATE CSV-FORMATTED STRINGS
var csvLine = "";
var numsArray = new Array();
for (var i=0; i<objRow.length; i++) {
  //check if this is the first element with a new 'ANI' (which means a new CSV line starts)
  if (objRow[i-1]==(undefined||null) || objRow[i].ANI!=objRow[i-1].ANI) {
    //if so, start a new string
    csvLine = objRow[i].ANI +", "+ objRow[i].customerID +", "; //add the 'ANI' and 'customerID'
    numsArray.length = 0; //clear array
    numsArray.push(objRow[i].nums); //store the 'nums' in a separate array
  } else {
    //if not, add to the existing string
    numsArray.push(objRow[i].nums); //store the 'nums' in a separate array
  }

  //check if this is the last element with the same 'ANI' (which means this CSV line is complete)
  if (objRow[i+1]==(undefined||null) || objRow[i].ANI!=objRow[i+1].ANI) {
    //add the 'nums' of every object in intertwining order (every 1st, every 2nd, etc.)
    for (var k=0; k<numsArray[0].length; k++) {
      for (var j=0; j<numsArray.length; j++) {
        csvLine += numsArray[j][k].toString() +", ";
      }
    }
    //remove the last comma
    if (csvLine.substring(csvLine.length-2) == ", ") {
      csvLine = csvLine.substring(0,csvLine.length-2);
    }
    //output the CSV line
    document.getElementById("csv").innerHTML += csvLine + "<br />";
  }
}
<div id="csv"></div>

(fiddle: http://jsfiddle.net/5gyp3ce6/16/)

I had to change your array a little bit, because for this to work, the array keys need to all be the same.
Also, I had to change the ID's to strings, otherwise they couldn't be defined.

Instead of writing it to the <div> at the end you can of course add the line to another variable of write it to file or whatever.

If the comments in the code aren't clear enough, just leave a comment and I'll try to explain it better.

Sign up to request clarification or add additional context in comments.

2 Comments

Hello, thanks for your answer. I already update my question, for nums rules.
@fanjavaid - I updated my answer, the nums are now intertwined like in your question
0

Try

var objRow = [
    {
        "2011-09-20" : [0, 100, 0],
        customerID : "C1101",
        ANI : 1234
    },
    {
        "2011-09-25" : [0, 0, 0],
        customerID : "C1101",
        ANI : 1234
    },
    {
        "2011-09-20" : [0, 500, 0],
        customerID : "C1102",
        ANI : 5678
    },
    {
        "2011-09-22" : [0, 0, 50],
        customerID : "C1102",
        ANI : 5678
    }
];

var arr = [],
    res = [],
    csv = $.map(objRow, function (v, k) {  
        // items         
        arr.push(v.ANI, v.customerID, v[Object.keys(v)[0]]);
        // arrays
        var a = $.grep(arr, function (val, index) {
            return $.isArray(val)
        });
        // strings
        var s = arr.filter(function (i) {
            return typeof i === "string"
        });
        // sort items
        res.push([arr.filter(Number)[0]
                 , s[0]
                 , a.splice(0, 2).join(",")
                 , arr.filter(Number).slice(-1)[0]
                 , s.slice(-1)[0]
                 , a.join(",")]);
        return res
    }).slice(-1)[0];
    // format text , html
    csv = (csv.slice(0, 3) + "<br>" + csv.slice(-3))
          .replace(/,/g, ", ");
    $("body").append(csv)

var objRow = [
    {
        "2011-09-20" : [0, 100, 0],
        customerID : "C1101",
        ANI : 1234
    },
    {
        "2011-09-25" : [0, 0, 0],
        customerID : "C1101",
        ANI : 1234
    },
    {
        "2011-09-20" : [0, 500, 0],
        customerID : "C1102",
        ANI : 5678
    },
    {
        "2011-09-22" : [0, 0, 50],
        customerID : "C1102",
        ANI : 5678
    }
];

var arr = [],
    res = [],
    csv = $.map(objRow, function (v, k) {
        arr.push(v.ANI, v.customerID, v[Object.keys(v)[0]]);
        // arrays
        var a = $.grep(arr, function (val, index) {
            return $.isArray(val)
        });
        // strings
        var s = arr.filter(function (i) {
            return typeof i === "string"
        });

        res.push([arr.filter(Number)[0], s[0], a.splice(0, 2).join(","), arr.filter(Number).slice(-1)[0], s.slice(-1)[0], a.join(",")]);
        return res
    }).slice(-1)[0]; 

csv = (csv.slice(0, 3) + "<br>" + csv.slice(-3))
      .replace(/,/g, ", ");
$("body").append(csv)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.