数组

js深拷贝与浅拷贝

左心房为你撑大大i 提交于 2020-03-28 05:54:09
实现一个页面或者一个功能时,常常遇到的场景需要我们备份一个数组或者对象,这时候出现了深拷贝与浅拷贝效果截然不同呀总结如下: 浅拷贝: 1 var 2 arr = [1, 2, 3, 4], 3 shallowArr = a; 4 arr[0] = "change"; 5 console.log(arr); 6 console.log(shallowArr); 很简单的例子,很明显结果是两个数组第一项同时发生改变,原因是因为arr与shallowArr两数组为同一数组,仅仅是地址名不同,而地址却是同一个。那么如何避免上面的情况发生呢那就是深拷贝了。 深拷贝: 1 var 2 arr = [1, 2, 3, 4], 3 deepArr = [].concat(arr); 4 console.log(arr === shallowArr); // false 上述代码这是针对数组内部为简单类型的深拷贝,当数组内部的成员为引用类型时上面的方式还能算深拷贝吗? 1 var 2 arr = [{ m: 1 }, { n: 2 }], 3 deepArr = [].concat(arr); 4 console.log(arr === deepArr); // false5 console.log(arr[0] === deepArr[0]); //true 很明显数组地址发生变化

数组深拷贝的方法

最后都变了- 提交于 2020-03-28 05:46:07
方法一:for循环实现 var arr = [1,2,3,4,5] var arr2 = copyArr(arr) function copyArr(arr) { let res = [] for (let i = 0; i < arr.length; i++) { res.push(arr[i]) } return res }方法二:slice方法原理也比较好理解,他是将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝,如下 var arr = [1,2,3,4,5] var arr2 = arr.slice(0) arr[2] = 5 console.log(arr) console.log(arr2)方法三:concat方法原理更加粗暴。它是用于连接多个数组组成一个新的数组的方法。那么,我们只要连接它自己,即可完成数组的深拷贝。代码如下 var arr = [1,2,3,4,5] var arr2 = arr.concat() arr[2] = 5 console.log(arr) console.log(arr2) 方法四:ES6扩展运算符实现用下面的方法实现数组的深拷贝是最简单的 var arr = [1,2,3,4,5] var [ ...arr2 ] = arr arr[2] = 5 console.log(arr) console

JavaScript Array 整理 元素操作

喜你入骨 提交于 2020-03-28 03:08:17
此文章是我的原创文章,地址: http://www.faceye.net/search/142558.html 整理了一些Array常用的遍历操作方法,今天再整理一下Array对象中针对元素操作的方法。 分别是: concat (组合数组) join(数组转字符串) pop(删除最后一个元素) shift(删除第一个元素) push(在数组尾部添加新元素) unshift(在数组头部添加新元素) slice (不改变数组本身,常用将类数组转换成数组,而后可以使用数组方法操作类数组) splice (指定位置、截取、替换) Array.prototype.concat(arr[, arr1, ......, arrN]) 描述 此方法返回一个由自身及所传参数拼接成的新数组,每一个参数都必须为数组类型。 return Array,由自身及参数拼接成的新数组。 demo javascriptvar arr = [1,2,3]; arr.concat(['a'], ['b']) [1, 2, 3, "a", "b"] Array.prototype.join([str]) 描述 此方法将数组中所有元素组合成一个字符串,默认以“,”号拼接,也可以指定拼接参数。 return String, 有数组中所有元素拼接成的字符串 demo javascriptvar arr = [1,2,3];

使用ivx实现栈面板的经验总结

喜夏-厌秋 提交于 2020-03-27 23:05:46
之前有一片帖子已经详细说明了如何实现折叠面板,今天再来说说另一种面板形式——栈面板。栈面板也是纵向排列子部件,但是它的特点是任意时刻只显示某一部件的内容,其它部件则只显示标题。用户可以通过点击标题进行切换,是一种十分有用的垂直菜单系统。比如当我展开购物中心后,我再点击浏览历史则浏览历史展开的同时,购物中心也会完全合起。 1.变量 通用变量“导航栏数据”的格式如下图,与折叠面板相似他也是三层结构,first、second和third分别对应三级菜单,name是菜单名称,status是菜单的展开状态,0是合起,1是开启。 相比折叠面板多添加了一个文本变量“当前选中页面”,它的作用是存放我们当前选中的菜单的name。因为在折叠面板中我们任意时刻只有一个菜单是展开的,从数据上讲只有一个子菜单的status和它的父菜单的status等于1,并将最低层级菜单的name赋值给“当前选中页面”。 2.第一级循环 第一级循环对应first数组,当前数据1即first的数组元素。菜单行就是用来显示一级菜单的,其中的文本组件绑定了first数组元素的子元素name,即菜单名称。 if容器则是做一个状态判断,如果当前菜单展开,显示指向上的图标,如果当前菜单合起,显示指向右的图标。同时图标本身的可见属性也进行了数据绑定,只有当前菜单含有子菜单,图标才是可见的。 点击菜单时首先判断菜单的状态

C# 基础知识系列- 3 集合数组

早过忘川 提交于 2020-03-27 20:56:00
简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案。比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多、很乱。我们对照集合的概念对仓库进行管理的话,那么 数组就是将一堆货整整齐齐的码在仓库的某个地方,普通列表也是如此;Set就是在仓库里有这么一个货架,每种货品只能放一个,一旦某种货品超过一个了货架就塌了;Dictionary字典呢,在一个货架上随机摆放,然后再找一个本子把每个货品存放的位置记录下来。 1. 主要集合 C#/.NET Framework 提供了很多很有意思的集合类,数组、列表、链表、Set、字典等一系列的类。其中数组是语言的一部分,个人认为严格意义上不属于集合类这一部分。C#开发中常用的集合有数组、 List类、Set接口、Dictionary类、Queue类、LinkedList类等,其他的出镜率不高。 与其他(java)语言不同的一点是,C#的 List 是类,而不是接口,接口是 IList ,但这个接口意义不大,在使用 IList 的时候更多的倾向于使用 IEnumerable ,这主要是因为 IEnumerable 有 Linq 的支持再者两者的方法基本一致,能用 IList 的地方基本都可以用 IEnumerable 。 1.1 Array 数组 数组,集合的基础部分

4. Median of Two Sorted Arrays

我们两清 提交于 2020-03-27 17:00:58
▶ 问题:求两个已经排好序的数组的中位数。 ▶ 简单的归并版。现将两个数组一趟归并到一个数组中(O(m+n)),再利用新数组长度的奇偶性计算新数组的中位数(O(1)),总体时间复杂度 O(m+n),空间复杂度 O(m+n)。 ● 代码,79 ms 1 class Solution // O(m+n) 2 { 3 public: 4 double findMedianSortedArrays(std::vector<int>& nums1, std::vector<int>& nums2) 5 { 6 std::vector<int>temp; 7 int i, j; 8 for (i = 0, j = 0; i < nums1.size() && j < nums2.size();) // merge common part 9 temp.push_back(nums1[i] < nums2[j] ? nums1[i++] : nums2[j++]); 10 if (i < nums1.size() || j < nums2.size()) // merge rest part 11 { 12 std::vector<int> & ref = (i < nums1.size()) ? nums1 : nums2; 13 for (i = (i < nums1.size()) ? i

php数组函数

南笙酒味 提交于 2020-03-27 15:54:05
数组 php中的数组是一个有序映射,映射是一种把values关联到keys的类型,数组可以接受任意数量用逗号分隔符的键值对。 数组的介绍 /* * php中数组可以分为: * 索引数组:下标是数字 * 关联数组:下标是字符串 * 注:php中数组其实不区分索引还是关联数组,都是根据键名找到对应的值 * * php可以同时包含integer和string类型的键名 * key:可以是一个整数integer或者字符串string * value:可以是任意类型的值 * * php中的key只能是integer或这string类型,如果使用其他类型会自动转换: * 1. 包含有合法整型值的字符串会被自动转换成整型(如'8'会被转换为8,但是'08'不会被转换) * 2. 浮点数会被转换成整型,小数部分会被舍去 * 3. 布尔值会被转换成整型(true转成1,false转成0) * 4. NULL会被转换成空字符串,即'' * 5. 数组和对象不能被用为键名 * * 如果数组定义中多个单元都用了同一个键名,则只会使用最后一个,之前的值都会被覆盖 * 如果没有指定键名,且键名不都为负数,新添加的元素的键名是已有键名的最大值+1 * 如果键名都为负数,那么新添加的元素键名从0开始 * */ 数组的创建 $arr1 = array(); //创建一个空数组 $arr2 = array(1, 2,

php整理

自闭症网瘾萝莉.ら 提交于 2020-03-27 14:58:16
1. include 和 require 的区别 加载失败的处理方式不同。引入不存在的文件时, include 会产生警告且脚本还会继续执行, require 则会导致一个致命性错误且脚本停止执行。 文件引用方式不同。 include() 执行时需要引用的文件每次都进行执行,并且可以有返回值, require() 只是单纯的文件替换,没有返回值 require 一般放在 PHP 文件的最前面,程序在执行前会先倒入所需要引用的文件; include 一般放在程序的控制流程中,当程序执行时碰到才会引用,简化程序的执行流程。 2.常用关键字 final :用于声明方法和类,修饰类时,该类不能被继承,修饰方法时,该方法不能被覆盖。 static :主要用来修饰成员变量以及成员方法,分别为静态变量和静态方法,通过类直接调用。 global :主要使用于函数内声明变量为全局变量,在函数内部可以使用外部变量。 global 声明的变量只是全局变量的一个同名引用, $GLOBALS 是全局变量本身。 this 、 self 、 parent : this 是指向当前对象的指针, self 是指向当前类的指针, parent 是指向当前父类的指针。 Trait :是为 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制

渲染列表数据

こ雲淡風輕ζ 提交于 2020-03-27 12:46:41
列表数据在前端非常常见,我们经常要处理这种类型的数据,例如文章列表、评论列表、用户列表…一个前端工程师几乎每天都需要跟列表数据打交道。 React.js 当然也允许我们处理列表数据,但在使用 React.js 处理列表数据的时候,需要掌握一些规则。我们这一节会专门讨论这方面的知识。 渲染存放 JSX 元素的数组 假设现在我们有这么一个用户列表数据,存放在一个数组当中: const users = [ { username: 'Jerry', age: 21, gender: 'male' }, { username: 'Tomy', age: 22, gender: 'male' }, { username: 'Lily', age: 19, gender: 'female' }, { username: 'Lucy', age: 20, gender: 'female' } ] 如果现在要把这个数组里面的数据渲染页面上要怎么做?开始之前要补充一个知识。之前说过 JSX 的表达式插入 {} 里面可以放任何数据,如果我们往 {} 里面放一个存放 JSX 元素的数组会怎么样? ... class Index extends Component { render () { return ( <div> {[ <span>React.js </span>, <span>is </span>

Vue2.0源码阅读笔记(二):响应式原理

夙愿已清 提交于 2020-03-27 11:45:22
  Vue是数据驱动的框架,在修改数据时,视图会进行更新。数据响应式系统使得状态管理变的简单直接,在开发过程中减少与DOM元素的接触。而深入学习其中的原理十分有必要,能够回避一些常见的问题,使开发变的更为高效。 一、实现简单的数据响应式系统   Vue使用 观察者模式 (又称 发布-订阅模式 )加 数据劫持 的方式实现数据响应式系统,劫持数据时使用 Object.defineProperty 方法将 数据属性 变成 访问器属性 。Object.defineProperty 是 ES5 中一个无法 shim 的特性,因此Vue 不支持 IE8 以及更低版本浏览器。   Vue源码中对数据响应式系统的实现比较复杂,在深入学习这部分源码之前,先实现一个较为简单的版本更有助于后续的理解。代码如下所示: let uid = 0 // 容器构造函数 function Dep() { // 收集观察者的容器 this.subs = [] this.id = uid++ } Dep.prototype = { // 将当前观察者收集到容器中 addSub: function(sub) { this.subs.push(sub) }, // 收集依赖,调用观察者的addDep方法 depend: function() { if(Dep.target){ Dep.target.addDep(this)