Try a blob.

(no, not that kind)
demo
var blob = new Blob(["CSV DATA HERE"], {type: "text/csv"});
var url = URL.createObjectURL(blob);
open(url);
Need to convert JSON to CSV?
demo
(https://stackoverflow.com/a/14966131/6560716)
var data = [["name1", "city1", "some other info"], ["name2", "city2", "more info"]];
var csvContent = "";
data.forEach(function(infoArray, index){
dataString = infoArray.join(",");
csvContent += index < data.length ? dataString+ "\n" : dataString;
});
var blob = new Blob([csvContent], {type: "text/csv"});
var url = URL.createObjectURL(blob);
open(url);
Need to have a name for the file?
demo
var blob = new Blob(["CSV DATA HERE"], {type: "text/csv"});
var url = URL.createObjectURL(blob);
var link = document.createElement("a");
link.setAttribute("href", url);
link.setAttribute("download", "filename.csv");
document.body.appendChild(link);
link.click();
Filename and JSON?
demo
var data = [["name1", "city1", "some other info"], ["name2", "city2", "more info"]];
var csvContent = "";
data.forEach(function(infoArray, index){
dataString = infoArray.join(",");
csvContent += index < data.length ? dataString+ "\n" : dataString;
});
var blob = new Blob([csvContent], {type: "text/csv"});
var url = URL.createObjectURL(blob);
var link = document.createElement("a");
link.setAttribute("href", url);
link.setAttribute("download", "filename.csv");
document.body.appendChild(link);
link.click();