JavaScript中的apply.map函数引用的原始对象
我从json文件中读取数据并将其存储在javascript中的对象中,我使用d3js库读取该文件 这是data.json文件中原始数据的样子:JavaScript中的apply.map函数引用的原始对象,javascript,ecmascript-6,Javascript,Ecmascript 6,我从json文件中读取数据并将其存储在javascript中的对象中,我使用d3js库读取该文件 这是data.json文件中原始数据的样子: { "bitcoin": [ { "24h_vol": null, "date": "12/5/2013", "market_cap": null, "price_usd": null }, {
{
"bitcoin": [
{
"24h_vol": null,
"date": "12/5/2013",
"market_cap": null,
"price_usd": null
},
{
"24h_vol": null,
"date": "13/5/2013",
"market_cap": null,
"price_usd": null
},
{
"24h_vol": "0",
"date": "14/5/2013",
"market_cap": "1500517590",
"price_usd": "135.3"
},...]
"bitcoin_cash": [
{
"24h_vol": null,
"date": "12/5/2013",
"market_cap": null,
"price_usd": null
},
{
"24h_vol": null,
"date": "13/5/2013",
"market_cap": null,
"price_usd": null
},...]
}
我读了这篇文章,然后过滤掉一些空条目,并分别解析日期和整数值,这是相同的代码:
//Get data
d3.json("data/coins.json").then((data) => {
console.log("original data", data.bitcoin);
/*---
original data (1633) [{…}, , …]
[0 … 99]
0: {24h_vol: null, date: "12/5/2013", market_cap: null, price_usd: null}
1: {24h_vol: null, date: "13/5/2013", market_cap: null, price_usd: null}
2: {24h_vol: "0", date: Tue May 14 2013 00:00:00 GMT-0400 (Eastern Daylight Time), market_cap: 1500517590, price_usd: 135.3}
...
--------*/
//Selector listener
$("#coin-select").change(function() {
var coinType =this.value;
var coinData = data[coinType];
var cleanData = coinData.filter((d) => {
return (d.price_usd)
}).map((d) => {
d.price_usd =+ d.price_usd;
d.market_cap =+ d.market_cap;
d.date = parsedDate(d.date);
return d;
});
console.log("cleanData", cleanData)
/*------
cleanData (1631) [{…}, {…}, , …]
[0 … 99]
0: {24h_vol: "0", date: Tue May 14 2013 00:00:00 GMT-0400 (Eastern Daylight Time), market_cap: 1500517590, price_usd: 135.3}
1: {24h_vol: "0", date: Wed May 15 2013 00:00:00 GMT-0400 (Eastern Daylight Time), market_cap: 1575032004, price_usd: 141.96}
---*/
update(cleanData);
});
//Default to bitcoin
$('#coin-select')
.val('bitcoin')
.trigger('change');
});
正如您可以看到的控制台输出,原始数据也解析了日期、市值和价格的值,不知道为什么会发生这种情况
谢谢你抽出时间
PS:这不仅仅发生在问题中提到的chrome中:试试这样:
$("#coin-select").change(function() {
var coinType = this.value;
var coinData = data[coinType];
var cleanData = coinData.filter(x => x.price_usd)
.map(d => ({
price_usd: d.price_usd =+ d.price_usd,
market_cap: d.market_cap =+ d.market_cap,
date: parsedDate(d.date)
}));
update(cleanData);
});
这确保您从
映射返回一个新对象
,这样您就不会对原始对象进行变异
,也会清除一些不需要的显式返回。对象通过Ref传递,而不是Val。如果要保留原始对象,您需要以创建新对象的方式执行操作,例如,您可以.map(d=>({…d,price_usd:d.price_usd+d.price_usd,market_cap:d.market_cap+d.market_cap,date:parsedDate(d.date)})在地图中
,创建一个新对象,而不是修改并返回当前对象。可能重复@vnt,这与在其他浏览器上发生的情况不同too@KevinB这似乎有效,但我仍然不完全理解,代码中没有这一行:var coinData=data[coinType];将“数据”对象与“coinData”对象分离。似乎不明白为什么在map函数对象中使用“coinData”会更改原始数据对象不确定如何使用.map的箭头函数。一个字母一个字母地复制似乎会产生语法错误。在对象文本中有一个额外的逗号。再次尝试是的,但似乎也缺少了一个结束括号,你能改变它吗?如果可能的话,你能让新对象的创建更加明确吗?也许这只是我的观点,但对于像我这样的ECMAScript 6 noobs来说,它可能更清晰一些