JSON 和 Array

1. JSON 格式的数据需要遵循什么规则

  1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
  2. 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用 NaN, Infinity, -Infinity和undefined)。
  3. 字符串必须使用双引号表示,不能使用单引号。
  4. 对象的键名必须放在双引号里面。
  5. 数组或对象最后一个成员的后面,不能加逗号。

2. 使用 JSON 对象实现一个简单的深拷贝函数(deepCopy)

var obj1 = {
  age: 20,
  name: 'wangpeng',
  friend : {
    name: 'dog',
    sex: 'male'
  }
}

function copy(obj) {
var newObj = {}
newObj = JSON.parse( JSON.stringify(obj) )
return newObj
}

var obj2 = copy(obj1)
console.log(obj2)

3.1 数组方法里push、pop、shift、unshift、join、splice分别是什么作用?

var arr = [1, 2, 3, 4]
arr.push('wangpeng') // 在数组的最后面添加一个元素, 返回数组的长度 5
console.log(arr)  //  [1, 2, 3, 4, 'wangpeng']
arr.pop() // 把数组的最后一个元素取出来,返回这个元素 4
console.log(arr)  // [1, 2, 3]
arr.unshitf('wangpeng') //  在数组的最前面添加一个元素, 返回数组的长度 5
console.log(arr)  // ['wangpeng', 1, 2, 3, 4]
arr.shift() // 把数组的第一个元素取出来,返回这个元素 1
console.log(arr)  // [2, 3, 4]
var str1 = arr.join()
// 把数组中的所有元素放入一个字符串, 元素是通过指定的分隔符进行分隔, 参数为空则和数组一样,用逗号分隔
console.log(str1)  // 1,2,3,4
console.log(arr)  // [1, 2, 3, 4]
var str2 = arr.join("") // 表示用空字符串连接
console.log(str2)  // 1234
var arr1 = arr.splice(1,2) // 从arr中,下标为1的元素开始,拿出2个元素作为数组返回,原数组发生改变 [2, 3]
console.log(arr) // [1, 4]

3.2 用 splice函数分别实现push、pop、shift、unshift方法

JavaScript提供了一个splice方法用于一次性解决数组添加、删除(这两种方法一结合就可以达到替换效果),方法有三个参数

  1. 开始索引 (可以是负数,表示从后向前索引, - 1 可以理解为 arr.length - 1)
  2. 删除元素的位移
  3. 插入的新元素,当然也可以写多个

splice方法返回一个由删除元素组成的新数组,没有删除则返回空数组

arr.splice(arr.length, 0, 5) // push 在 arr 中最后面,添加元素 5
//  这里 splice 模拟,push,必须要大于等于length,不能length-1。否则会在最后一个元素之前的一位添加 
arr.splice(arr.length-1, 1) // pop 从arr 中删除最后一个元素,并返回这个由删除元素组成的新数组,原数组改变, arr.length-1 可以 理解为 -1,代表着数组最后一位
//这里也可以是 - 1,表示arr 最后一位, 但是和上面的添加元素不同,这里第一个参数超出 arr 最大下标之后,返回空数组,也就是没有删除
arr.splice(0, 0, 0) // unshift 在 arr 中最前面,添加元素 0
arr.splice(0, 1) // shift 从 arr 中删除第一个元素

4. 写一个函数,操作数组,数组中的每一项变为原来的平方,在原数组上操作

方法一: 虽然原数组变了,但是函数内部,不是在原数组操作,而是把平方结果进行赋值

function squareArr(arr){
  for(var i = 0; i < arr.length; i++){
    arr[i] = arr[i] * arr[i]
  }
}
var arr = [2, 4, 6]
squareArr(arr)
console.log(arr) // [4, 16, 36]

方法二: 使用splice方法, 在原数组上进行替换(实际过程是: 删除+新增)

function squareArr(arr){
  for(var i = 0; i < arr.length; i++){
    arr.splice(i,1,Math.pow(arr[i],2))
  }
}
var arr = [2, 4, 6]
squareArr(arr)
console.log(arr) // [4, 16, 36]

5. 写一个函数,操作数组,返回一个新数组,新数组中只包含正数

首先是直接在原数组上操作,最后原数组发生改变

function filterPositive(arr){
  for(var i = 0; i < arr.length; i++){
    if( typeof arr[i] !== 'number' || arr[i] <= 0 ){
      arr.splice(i,1)
      i--
    }
  }
}
var arr = [3, -1,  2,  '饥人谷', true]
filterPositive(arr)
console.log(arr) //[3,  2]

正确方法是向新的数组内 push 元素,然后return 新的数组,这样返回的才是新数组,而原数组不变

function filterPositive(arr){
  var newArr = []
  for(var i = 0; i < arr.length; i++){
    if(typeof arr[i] === 'number' && arr[i] > 0 ){
      newArr.push(arr[i])
    }
  }
  return newArr
}
var arr = [3, -1,  2,  '饥人谷', true]
var newArr = filterPositive(arr)
console.log(newArr) //[3, 2]
console.log(arr) //[3, -1,  2,  '饥人谷', true]

你可能感兴趣的:(JSON 和 Array)