美文网首页
JS对象 & JSON & JS数组操作

JS对象 & JSON & JS数组操作

作者: Long_Dark | 来源:发表于2020-03-14 18:25 被阅读0次

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

JSON 格式(JavaScript Object Notation 的缩写)是一种用于数据交换的文本格式,2001年由 Douglas Crockford 提出,目的是取代繁琐笨重的 XML 格式。

JSON格式基本规则
  • 并列的数据之间用逗号(", ")分隔。
  • 映射用冒号(": ")表示。
  • 并列数据的集合(数组)用方括号("[]")表示。
  • 映射的集合(对象)用大括号("{}")表示。
另外JSON 对值的类型和格式有严格的规定
  1. 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象。
  2. 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity, -Infinity和undefined)。
  3. 字符串必须使用双引号表示,不能使用单引号。
  4. 对象的键名必须放在双引号里面。
  5. 数组或对象最后一个成员的后面,不能加逗号。

以下是合格的JSON格式

["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ]

以下是不合格的写法

{ name: "张三", 'age': 32 }  // 属性名必须使用双引号

[32, 64, 128, 0xFFF] // 不能使用十六进制值

["one","two","three",] //最后边不要加逗号

{ "name": "张三", "age": undefined } // 不能使用undefined

{ "name": "张三", "age": null, } // 最后边不要加逗号

{ "name": "张三",
  "birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
  "getName": function() {
      return this.name;
  }
} // 不能使用函数和日期对象

2. 遍历 company 对象,输出里面每一项的值

var company = {
    name: '饥人谷',
    age: 3,
    sex: '男'
}
//
var company = {
    name: '饥人谷',
    age: 3,
    sex: '男'
}
for (var i in company){
    console.log (company[i])
}

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

JSON.stringify方法用于将一个值转为字符串。该字符串符合 JSON 格式,并且可以被JSON.parse方法还原。使用JSON.parse方法将JSON字符串转化成对象。

var student = {
  name: 'Jim',
  age: 3,
  friends: ['cat', 'dog', 'bird']
}
var student2 = JSON.parse(JSON.stringify(student))
student.age = 5
console.log(student2)

注意:JSON.stringify方法会忽略对象的不可遍历属性,如函数、正则表达式对象、日期对象等。所以这种深拷贝方法有局限性。

4.分别举例说明数组方法pushpopshiftunshiftjoinsplicesortreverseconcat的作用

var arr = [1, 2, 3, 4]
arr.push('dog') // 在数组的最后面添加一个元素, 返回数组的长度 5
console.log(arr)  //  [1, 2, 3, 4, 'dog']
arr.pop() // 把数组的最后一个元素取出来,返回这个元素 4
console.log(arr)  // [1, 2, 3]
arr.shift() // 把数组的第一个元素取出来,返回这个元素 1
console.log(arr)  // [2, 3, 4]
arr.unshitf('dog') //  在数组的最前面添加一个元素, 返回数组的长度 5
console.log(arr)  // ['dog', 1, 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 str3 = arr.join(-) // 表示用横线连接
console.log(str3)  // 1-2-3-4
var arr1 = arr.splice(1,2,8) // 从arr中,下标为1的元素开始,拿出2个元素作为数组返回,并且用8代替两个元素,会改变原数组
console.log(arr1) // [1,8,4]
var arr2 = arr.sort() //sort方法用于对数组进行排序,当没有参数的时候会按字母表升序排序,如果含有undefined会被排到最后面,会改变原数组
console.log(arr2) //[1, 2, 3, 4]
var a = [7,8,9,10,11] //其中如果含有十位数字,不加条件则会排序为[10,11,7,8,9],此时可以引入自定义排序

    a.sort(function(v1,v2){
        return v1-v2
    })
    console.log(a) //[7, 8, 9, 10, 11]
var arr3 = arr.reverse() //方法用于将数组逆序,它会修改原数组
console.log(arr3) // [4,3,2,1]
var arr0 = [5,6,7]
var arr5 = arr.concat(arr0) //concat方法用于拼接数组,它不会会修改原数组
console.log(arr5) // [1,2,3,4,5,6,7]

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

function filterPositive(arr){
}
var arr = [3, -1,  2,  '饥人谷', true]
filterPositive(arr)
console.log(filterPositive(arr)) //[3,  2]
//纯数字的时候可以使用for循环
//for (var i = 0,i < a.length,i++){
//  if(a[i]<0){
//    a.splice(i,1)
//    i--
//  }
//}
//或 for (var i = a.length-1,i > 0, i--){
//  if(a[i]<0){
//   a.splice(i,1) 
//   }
//}
function filterPositive(arr){
  var arr1 = []
  for(var i = 0;i < arr.length;i++){
    if(typeof arr[i] === 'number' && arr[i] > 0){
      arr1.push(arr[i])
    } 
  }
  return arr1
}
var arr = [3, -1,  2,  '饥人谷', true]
var arr1 = filterPositive(arr)
console.log(filterPositive(arr))

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

终极神器splice
JavaScript提供了一个splice方法用于一次性解决数组添加、删除(这两种方法一结合就可以达到替换效果),方法有三个参数
1.开始索引
2.删除元素的位移
3.插入的新元素,当然也可以写多个
splice方法返回一个由删除元素组成的新数组,没有删除则返回空数组

function push(arr, value){
    arr.splice(arr.length, 0, value)
    return arr.length
}
var arr = [3, 4, 5]
push(arr,10)
console.log(arr) // arr 变成[3,4,5,10],返回4
function pop(arr){
    arr.splice(arr.length-1, 1)
    return arr.length
}
var arr = [3, 4, 5]
pop(arr)
console.log(arr) // arr 变成[3,4],返回2
function shift(arr){
    arr.splice(0, 1)
    return arr.length
}
var arr = [3, 4, 5]
shift(arr)
console.log(arr) // arr 变成[4,5],返回2
function unshift(arr, val){
    arr.splice(0, 0, val)
    return arr.length
}
var arr = [3, 4, 5]
unshift(arr,10)
console.log(arr)  // arr 变成[10,3,4,5],返回4
使用`sort`进行排序

// 按age 从小到大排序
var sortByAge = users.sort(function(v1,v2){
return v1.age > v2.age
})

// 按name从大到小排序
var sortByName = users.sort(function(v1,v2){
return v1.name > v2.name
})

// 按company从大到小排序
var sortByCompany = users.sort(function(v1,v2){
return v1.company > v2.company
})

#8.分别举例说明ES5数组方法 indexOf、forEach、map、every、some、filter、reduce的用法
##### 1..indexOf(element) / .lastIndexOf(element)
这两个方法用于查找数组内指定元素位置,查找到第一个后返回其索引,没有查找到返回-1,indexOf从头至尾搜索,lastIndexOf反向搜索

var arr = [1,2,3,3,2,1]
console.log(arr.indexOf(2)) //1 正数第一个2
console.log(arr.lastIndexOf(2)) //4 倒数第一个2


##### 2. .forEach(element, index, array)
遍历数组,参数为一个回调函数,回调函数有三个参数:
- 当前元素
- 当前元素索引值
- 整个数组

var arr = new Array(1, 2, 3, 4);
arr.forEach(function(e,i,array){
array[i]= e + 1; //每项加1
});
console.log(arr); //[2, 3, 4, 5,]

##### 3. .map(function(element))
与forEach类似,遍历数组,回调函数返回值组成一个新数组返回,新数组索引结构和原数组一致,原数组不变

var a = [1, 2, 3, 4, 5, 6]

console.log(a.map(function(e){
return e + e
})) // [1, 4, 6, 8, 10, 12]
console.log(a) //[1, 2, 3, 4, 5, 6]

##### 4. .every(function(element, index, array)) / .some(function(element, index, array))
回调函数返回一个布尔值
every是所有函数的每个回调函数都返回true的时候才会返回true,当遇到false的时候终止执行,返回false
some函数是“存在”有一个回调函数返回true的时候终止执行并返回true,否则返回false
在空数组上调用every返回true,some返回false

var a = [1, 2, 3, 4, 5, 6]

console.log(a.every(function(e, i, arr){
return e < 5 //是不是每一个数都小于5
})) //false

console.log(a.some(function(e,i,arr){
return e > 4 //是不是有一些数大于4
})) //ture

##### 5. .filter(function(element))
返回数组的一个子集,回调函数用于逻辑判断是否返回,返回true则把当前元素加入到返回数组中,false则不加
新数组只包含返回true的值,索引缺失的不包括,原数组保持不变

var a = [1, 2, 3, 4, 5, 6]

console.log(a.filter(function(e){
return e > 3;
})) // [4, 5, 6]

console.log(a) //[1, 2, 3, 4, 5, 6]

##### 6. .reduce(function(v1, v2), value) / .reduceRight(function(v1, v2), value)
遍历数组,调用回调函数,将数组元素组合成一个值,reduce从索引最小值开始,reduceRight反向,方法有两个参数
- 回调函数:把两个值合为一个,返回结果
- value,一个初始值,可选

var a = [1, 2, 3, 4, 5, 6]
var b = a.reduce(function(v1, v2){
return v1 + v2
})
console.log(a) // 21

var b = a.reduceRight(function(v1, v2){
return v1 - v2
}, 100)
console.log(b) // 79

# 9. 写补全sortString函数,实现字符串倒序

function sortString(str){
//补全
}
var str = 'jirenguhungervalley'
var str2 = sortString(str)
console.log(str2) // 'yellavregnuhugnerij'

function sortString(str){
var strA = []
for(var i = str.length - 1;i >= 0;i--){
strA.push(str[i])
}
return strA.join('')
}
var str = 'jirenguhungervalley'
var str2 = sortString(str)
console.log(str2) // 'yellavregnuhugnerij'

//或者更简单一些
function sortString(str){
return str.split('').reverse().join('')
}
var str = 'jirenguhungervalley'
var str2 = sortString(str)
console.log(str2) // 'yellavregnuhugnerij'

相关文章

网友评论

      本文标题:JS对象 & JSON & JS数组操作

      本文链接:https://www.haomeiwen.com/subject/ubogshtx.html