数据可视化【一】JavaScript学习

本博客是我学习Curran Kelleher老师数据可视化课程的笔记,感兴趣的小伙伴可以点击这里学习。

three cores of data visualization:

  • analysis
  • design
  • construction

推荐书籍《visualization analysis & design》

使用https://vizhub.com/进行编程学习,这个网站好像是Curran Kelleher自己创建的一个教学网站。

JS知识点

该部分的学习除了上述课程以外,还参照了廖雪峰的JavaScript教程。

  • JavaScript代码可以直接嵌在网页的任何地方,不过通常我们都把JavaScript代码放到<head>中。由<script>...</script>包含的代码就是JavaScript代码,它将直接被浏览器执行。或者代码放在一个单独的.js文件中,然后在HTML中通过<script src="..."></script>引入这个文件
  • 如果在一个页面中引入多个文件,并且在<script></script>中间还有js代码,浏览器将将会按照顺序依次执行。
  • JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用nullundefined仅仅在判断函数参数是否传递的情况下有用。
  • 变量名是大小写英文、数字、$_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如ifwhile等。申明一个变量用varletconst语句,尽量使用const
  • var声明的变量的作用域是函数。内部函数可以访问外部函数定义的变量,并且会覆盖重名的变量。函数在定义的时候会扫描整个函数体的语句,把所有var变量的声明提升到函数顶部。因此为了防止出现混乱,应该在函数顶部使用var定义。更好的做法是使用let定义变量,这样的变量有块级作用域。constlet都有块级作用域,但是const无法改变
  • 如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量。在strict模式下这种声明方法是不允许的。启用strict模式的方法是在代码的第一行写上'use strict';
  • 在``包围的字符串中可以使用$加变量名来获得变量的值并转换成字符串,并且可以得到多行字符串。字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
  • 可以通过()=>{}的方式声明函数,不需要关键字function
  • 数组的长度保存在length属性中。如果修改length的值改变数组的大小。如果通过索引赋值,索引超过了范围,同样会引起数组大小的变化
  • 数组可以通过数组的forEach方法遍历数组
array.forEach(item => {//对item的操作
});

这种方法的好处是可以可以把里面的函数变成其他的,灵活的进行遍历

  • 数组使用map方法可以得到另一个数组,每个数组的值是函数处理过的值
let func = item => {//对item的操作
};
let tmp = array.map(item);
  • 数组可使用filter方法过滤元素,需要传入的函数返回布尔值
let tmp = array.filter(item => {})
  • 数组的sort()方法默认将数字转化为字符串,返回仍然是当前字符串。可以通过传入一个函数,分别返回-1,0,1来确定排序顺序。
  • 数组使用join方法可以将数组元素看成字符串拼接起来
  • 使用解构赋值可以使得代码更加简洁。如果是数组的话使用[],如果是对象的话使用{}
var person = {name: '小明',age: 20,gender: 'male',passport: 'G-12345678',school: 'No.4 middle school',address: {city: 'Beijing',street: 'No.1 Road',zipcode: '100001'}
};
var {name, address: {city, zip}} = person;
name; // '小明'
city; // 'Beijing'
zip; // undefined, 因为属性名是zipcode而不是zip
// 注意: address不是变量,而是为了让city和zip获得嵌套的address对象的属性:
address; // Uncaught ReferenceError: address is not defined//更换属性名
var person = {name: '小明',age: 20,gender: 'male',passport: 'G-12345678',school: 'No.4 middle school'
};// 把passport属性赋值给变量id:
let {name, passport:id} = person;
name; // '小明'
id; // 'G-12345678'
// 注意: passport不是变量,而是为了让变量id获得passport属性:
passport; // Uncaught ReferenceError: passport is not defined//添加默认值
var person = {
var person = {name: '小明',age: 20,gender: 'male',passport: 'G-12345678'
};// 如果person对象没有single属性,默认赋值为true:
var {name, single=true} = person;
name; // '小明'
single; // true//有时候变量已经声明,则正确的写法也会报错
// 声明变量:
var x, y;
// 解构赋值:
{x, y} = { name: '小明', x: 100, y: 200};
// 语法错误: Uncaught SyntaxError: Unexpected token =
//正确写法
({x, y} = { name: '小明', x: 100, y: 200});
  • JSON.stringify(array, null, 2); 将数组转化为字符串,第二个参数一般用不上,第三个参数是添加换行的,否则挤在一起

  • JSON.parse(str)可以将上面的字符串再转换成数组

  • 对象最后一个键值对不要加逗号,否则有的浏览器会报错

  • 访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来

  • 检测对象是否拥有某一属性可以用in操作符。有可能这个属性是继承得到的。为了判断一个对象是否是对象本身拥有的,可以用hasOwmProperty()方法。

var a =  ['A', 'B', 'C'];
for (let i in a){console.log(i);	//'0' '1' '2'console.log(a[i]); //'A' 'B' 'C'
}
var xiaohong = {name: '小红','middle-school': 'No.1 Middle School'
};

例如上面的属性名middle-school就不是一个有效的变量名,只能用xiaohong['middle-school']的方法进行访问。

  • for ... in ...可以把一个对象的所有属性名依次循环出来,可以用hasOwnProperty()过滤对象继承的属性,数组也是对象,不过属性名为数组的下标。需要注意的是得到的是属性名类型为String类型
  • JavaScript中对象的键值是字符串类型的。如果想要让键值为其他类型的,可以使用Map。可以用二维数组对Map进行初始化,常用的方法有set get has delete
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefinedm = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
m.get('Adam'); // 88
  • SetMap相似,但是不存储value。
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}
s.add(4);
s; // Set {1, 2, 3, "3", 4}
s.add(4);
s; // 仍然是Set {1, 2, 3, "3", 4}s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}
  • 为了解决MapSet不能使用下标访问的问题,我们可以使用for ... of ...循环来遍历,只循环集合本身的元素,后添加的元素不会循环
  • 同样的我们可以使用forEach方法进行循环。不过需要注意使用方法
    第三个参数是调用者本身
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {console.log(element);
});var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {console.log(value);
});var a = ['A', 'B', 'C'];
a.forEach(function (element) {console.log(element);
});
  • 函数如果没有return语句,函数执行完毕后也会返回结果,只是结果为undefined
  • 函数有多种定义方法
function abs(x) {if (x >= 0) {return x;} else {return -x;}
}var abs = function (x) {if (x >= 0) {return x;} else {return -x;}
};//不要忘记分号var abs = x => x>0 ? x : -x;
  • 由于JavaScript允许传入任意个参数而不影响调用,因此传入的参数比定义的参数多也没有问题,虽然函数内部并不需要这些参数。为了避免参数不存在,可以使用typeof运算符对参数进行检查。
function abs(x) {if (typeof x !== 'number') {throw 'Not a number';}if (x >= 0) {return x;} else {return -x;}
}
  • 特殊参数使用:arguments是调用者传入的所有参数的数组。...rest参数可以获得所有额外的参数。如果传入的参数连正常定义的参数都没有填满rest参数会接受一个空数组(不是undefined)。

  • 需要注意return后面不要随意换行,JS会自动加分号,可能导致错误。

  • 方法的this指针始终指向调用者,如果直接调用函数一般this指向window。在strict模式下,直接调用函数的this指针指向undefined。只有对象直接调用函数的this指针是有效的,内层嵌套的函数的this指针是无效的,解决方法是一个临时变量将this保存起来。

  • 对于上面的问题,还可以使用applycall方法解决。apply还能动态改变函数的行为

  • 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。

function count() {var arr = [];for (var i=1; i<=3; i++) {arr.push((function (n) {return function () {return n * n;}})(i));}return arr;
}var results = count();
var f1 = results[0];
var f2 = results[1];
var f3 = results[2];f1(); // 1
f2(); // 4
f3(); // 9
  • 在没有class机制,只有函数的语言里,借助闭包,同样可以封装一个私有变量。我们用JavaScript创建一个计数器
'use strict';function create_counter(initial) {var x = initial || 0;	//initial如果没有定义为假return {inc: function () {x += 1;return x;}}
}var c1 = create_counter();
c1.inc(); // 1
c1.inc(); // 2
c1.inc(); // 3var c2 = create_counter(10);
c2.inc(); // 11
c2.inc(); // 12
c2.inc(); // 13
  • 闭包还可以把多参数的函数变成单参数的函数。例如,要计算xy可以用Math.pow(x, y)函数,不过考虑到经常计算x2或x3,我们可以利用闭包创建新的函数pow2和pow3:
'use strict';function make_pow(n) {return function (x) {return Math.pow(x, n);}
}
// 创建两个新函数:
var pow2 = make_pow(2);
var pow3 = make_pow(3);console.log(pow2(5)); // 25
console.log(pow3(7)); // 343
  • 如果使用箭头函数要返回一个对象,而且对象只有一个键值对的时候要把对象用括号括起来

  • 箭头函数和匿名函数的区别:箭头函数内部的this总是指向词法作用域,也就是外层调用者。由于已经绑定,所以无法使用call或者apply()this进行绑定,传入的第一个参数被忽略。

  • setTimeOut(()=>{} , x)可以用来睡眠一样的操作,前面传入的是一个函数,后面是睡眠的秒数,单位是毫秒,睡眠xms后运行前面的函数

let waitSeconds = numSeconds => new Promise(resolve =>{const message = `${numSeconds} seconds have passed`;setTimeout(()=>{resolve(message)}, numSeconds*1000);
});
waitSeconds(2).then(message => console.log(message));

模仿视频在vizhub上的实现的代码:https://vizhub.com/Edward-Elric233/97bd1319ee774022babd69cd4cca220e

不过需要注意一点的是在这个网页上的import文件需要在文件名前面加上./,Curran老师在Youtube上说明了自己不用加也可以成功运行的原因是Bug。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库原理及应用【二】数据模型

层次模型 tree Record and fieldParent-Child relationship(PCR) 每个记录类型只有一个父节点 无法表达多对多信息 采用虚记录解决多对多 网状数据模型 系&#xff1a;主记录->属记录 主记录和属记录都可以有好多个 关系模型 表&#xff1a;table/relation 拥有更高的…

数据可视化【二】HTML+CSS+SVG+D3

HTML、CSS和SVG学习实现代码&#xff1a;https://vizhub.com/Edward-Elric233/89185eb96bc64a9d81777873a0ccd0b9 index.html <!DOCTYPE html> <html><head><title>Shapes with SVG and CSS</title><link rel"stylesheet" href&qu…

数据可视化【三】基本概念

Visualization is suitable when there is a need to augment human capabilities rather than replace people with computational decision-making methods. 当可以信赖的智能化的解决方案存在的时候&#xff0c;可视化是不必要的。 当不知道需要分析的问题是什么的时候&…

数据可视化【四】Bar Chart

Make a Bar Chart Representing a data table in JavaScriptCreating rectangles for each rowUsing linear and band scalesThe margin conventionAdding axes 以下学习内容参考博客&#xff1a;传送门 select()选择所有指定元素的第一个 selectAll()选择指定元素的全部 上…

数据库原理及应用【三】DBMS+SQL

DBMS Query LanguagesInterface and maintaining tools(GUI)APIsClass Library QL 不是图灵完备的&#xff0c;不是一种编程语言。 QL SQL是一种非过程化的查询语言。 DDL数据定义语言&#xff1a;表&#xff0c;视图QL 查询语言DML 数据操纵语言DCL 数据控制语言 Base t…

数据可视化【五】 Scatter Plot

Scatter Plot vizhub上实现的代码&#xff1a; https://vizhub.com/Edward-Elric233/53807a1b35d94329b3689081cd2ea945 https://vizhub.com/Edward-Elric233/b9647d50899a4a0e8e917f913cd0a53a https://vizhub.com/Edward-Elric233/8c6b50cd81a04f048f490f48e4fe6264 由前…

数据可视化【六】Line Chart Area Chart

Line Chart vizhub代码&#xff1a; https://vizhub.com/Edward-Elric233/094396fc7a164c828a4a8c2e13045308 实现效果&#xff1a; 这里先使用d3.line()设置每个点的x坐标和y坐标&#xff0c;然后再用这个东西设置path的d属性&#xff0c;就可以得到曲线。 const lineGen…

数据可视化【七】 更新模式

Enter 以下面这个简单的代码进行分析 const svg d3.select(svg); // svg.style(background-color, red); testconst height svg.attr(height); // equals paresFloat() const width svg.attr(width);const makeFruit type >( {type} ); //这种写法好像能够直接得到一个…

数据可视化【八】根据数据类型选择可视化方式

Marks:Rows PointsLinesAreas Channels:Columns PositionColorShape

数据可视化【九】单向数据流交互

我们使用一下上上篇博客的代码。 例如我们想要当鼠标点击水果的时候会出现黑色的框&#xff0c;再点击一下黑色的框就会消失。 首先&#xff0c;我们应该给组件添加点击事件&#xff1a; fruitBowl.js gruopAll.on(click, d > onClick(d.id));这个on函数第一个参数是事件…

数据库原理及应用【四】数据库管理系统

查询优化 数据库管理系统中非常重要的一部分。 代数优化 按照一定的规则将语句变化成关系代数以后进行优化 操作优化 对代数优化后的查询树使用比较好的方法进行查询。 主要是对连接运算进行优化 嵌套循环归并扫描索引优化哈希连接 恢复机制 备份&#xff08;完整备份差…

数据库原理及应用【五】安全性和完整性约束

数据库一致性被破坏&#xff1a; 系统故障许多用户的并发访问人为破坏事务本身不正确 保护数据库一致性的方法&#xff1a; 视图/查询修改访问控制 普通用户拥有资源特权的用户DBA 数据库的安全问题 身份验证 口令物理设备 GRANT CONNECT TO John IDENTIFIED BY 123456…

递归式复杂度求解

代换法 猜测复杂度验证是否满足递归式&#xff08;使用归纳法&#xff09;找到常数应该满足的条件针对基本情况&#xff0c;常数足够大时总是成立的 需要注意的是&#xff0c;我们猜测的复杂度有可能不满足递归式&#xff0c;这个时候就要通过减去一些低阶项来使得归纳成立。…

斐波那契数列计算

定义 斐波那契数列&#xff1a; F[n]{0,n01,n1F[n−1]F[n−2],elseF[n] \begin{cases} 0,n0 \\ 1,n1\\ F[n-1]F[n-2],else \end{cases} F[n]⎩⎪⎨⎪⎧​0,n01,n1F[n−1]F[n−2],else​ 朴素计算法 根据递归式F[n]F[n−1]F[n−2]F[n]F[n-1]F[n-2]F[n]F[n−1]F[n−2]进行计算…

P、NP、NP完全问题、NP难问题

可以在多项式时间内求解的问题称为易解的&#xff0c;而不能在多项式时间内求解的问题称为难解的。 P类问题&#xff1a;多项式类型&#xff0c;是一类能够用&#xff08;确定性的&#xff09;算法在多项式的时间内求解的判定问题。 只有判定问题才属于P 不可判定问题&#…

数据可视化【十】绘制地图

Loading and parsing TOPOJSON 导入Topojson d3文件 地址&#xff1a;https://unpkg.com/topojson3.0.2/dist/topojson.min.js 想要找d3文件的话去unpkg.com好像大部分都能找到的样子 Rendering geographic features 寻找合适的地图数据&#xff1a;谷歌搜索world-atlas npm…

数据可视化【十一】树状图

Constructing a node-link tree visualization 首先将节点之间的连线画出来。 使用json函数读取文件以后&#xff0c;使用hierarchy等函数得到连线的数组&#xff0c;然后绑定这个数组&#xff0c;给每个元素添加一个path&#xff0c;绘画使用的是一个函数linkHorizontal&…

数据可视化【十二】 颜色图例和尺寸图例

有了前面的知识&#xff0c;制作一个图例应该不是很难&#xff0c;关键是我们想要制作一个可以在其他地方进行使用的图例&#xff0c;这样就需要能够动态地设置图例的大小&#xff0c;位置&#xff0c;等等。 这里直接上代码&#xff1a; colorLegend.js export const color…

数据可视化【十三】地区分布图

在前面的博客中已经介绍了如何绘制地图&#xff0c;这一节学习如何绘制地区分布图。如果对绘制地图还不熟悉的话可以了解一下之前我写的博客&#xff1a;数据可视化【十】绘制地图 Intergrating(整合) TopoJSON with tabular data(列表数据) 在前面的博客中没有使用到tsv文件…

3.01【python正则表达式以及re模块】

python正则表达式以及re模块 元字符 正则表达式的语法就由表格中的元字符组成&#xff0c;一般用于搜索、替换、提取文本数据 元字符含义.匹配除换行符以外的任何单个字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定义字符集&#xff…