js-读书笔记-函数式编程-数据思考-表数据结构

这篇博客主要介绍了JavaScript中对象和数组的各种操作技巧,包括keys、values、pluck、pairs、invert、omit、pick等方法的使用,以及如何进行对象转换、筛选、重命名属性等。此外,还涉及到函数如existy、truthy以及根据条件提取对象属性的方法。内容涵盖了数据结构处理的基础和进阶应用。
摘要由CSDN通过智能技术生成
// 数据思考-表数据结构
const _ = require('../lib/underScore.js')
// const utils = require('../lib/utils.js')
const Utils = function() {}
Utils.existy = function(x) {
  return x != null
}
// 判断是否为 true 的含义
Utils.truthy = function(x) {
  return (x != false) && this.existy(x)
}

let zombie = {name: 'Bub', film: "Day of the dead"}
console.log( _.keys(zombie))
console.log( _.values(zombie))
let book = [
  {title: 'js', author: 'a'},
  {title: 'java', author: 'b'},
  {title: 'rust', author: 'c'},
]
console.log(_.pluck(book, 'title')) // 提取key对应的value数组
console.log(_.pairs(book)) // 转为多维数组
console.log(_.pairs(zombie)) // 转为多维数组

// 先将对象转为多维数组,再从多维数组转回对象。
let res = _.object(_.pairs(zombie).map((pair) => [pair[0].toUpperCase(), pair[1]])) // object将多维数组转为对象
console.log('res', res)

console.log(_.invert(zombie)) // 反转键值对

// 根据参数从对象中提取值
res = _.pluck(book.concat({title: 'python'}).map((obj) => _.defaults(obj, {author: 'unknown'})), 'author')
console.log(res)

// 白名单、黑名单
let person = {name: 'ruby', token: 'jdh', password: 'test'}
console.log(_.omit(person, 'token', 'password')) // 黑名单
console.log(_.pick(person, 'token', 'password')) // 白名单

let library = [
  {
    title: '数据结构',
    ed:1,
    author: '蔚敏老师'
  },
  {
    title: '算法',
    ed:2,
    author: '左大'
  },
  {
    title: '算法',
    ed:3,
    author: '阿北'
  },
  {
    title: 'es6',
    ed:3,
    author: '阮一峰'
  }
]

console.log(_.findWhere(library, {title: '算法'})) // 返回第一条数据,对象
console.log(_.where(library, {title: '算法'})) // 返回所有匹配数据,数组

// 根据key值查找
function project(table, keys) {
  // 将item和keys合并成数组,再使用apply解耦出来,最后传入pick进行白名单筛选。
  // return table.map(item => _.pick.apply(null, constructor(item, keys)))
  return table.map(item => _.pick(item, ...keys))
}
let ebook = project(library, ['title', 'ed'])
console.log(ebook)
let ebook2 = project(ebook, ['title'])
console.log(ebook2)
console.log(_.pluck(ebook2, 'title'))

// 重命名
function rename (obj, newNames) {
  // let pre = _.omit.apply(null, constructor(obj, _.keys(newNames)))
  let pre = _.omit(obj, ..._.keys(newNames))
  // console.log(pre)
  // _.reduce也可以循环对象。
  return _.reduce(newNames, (pre, cur, key) => {
    if(_.has(obj, key)) {
      pre[cur] = obj[key]
      return pre
    } else {
      return pre
    }
  }, pre)
}

console.log(rename({a:1, b:2}, {'a': 'AA'}))
// { b: 2, AA: 1 }

function as (table, newNames) {
  return table.map(item => rename(item,newNames))
}
console.log(as(library, {ed: "eid"}))
/*
[
  { title: '数据结构', author: '蔚敏老师', eid: 1 },
  { title: '算法', author: '左大', eid: 2 },
  { title: '算法', author: '阿北', eid: 3 },
  { title: 'es6', author: '阮一峰', eid: 3 }
] 
 */

console.log(project(as(library, {ed: 'myEid'}), ['myEid'])) 
// [ { myEid: 1 }, { myEid: 2 }, { myEid: 3 }, { myEid: 3 } ]

// 筛选函数
function restrict(table, pred) {
  return _.reduce(table, function(newTable, obj) {
    if(Utils.truthy(pred(obj))) {
      return newTable
    } else {
      return _.without(newTable, obj)
    }
  }, table)
}

book = restrict(library, function(book){
  return book.ed > 1
})
console.log(book)









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值