Flatten State

225 阅读1分钟

Flatten State

平时在操作数据的增删改查中 我们经常会操作数组,同时使用各种数组的API,例如 find,map, filter ...

但是使用 Flatten State 的方法,也就是 扁平化数据 能更好的精简代码,是一种类似 hashMap 的数据格式。

const arr = [
  {
    id: 1,
    name: '小明',
    age: 18
  },
  {
    id: 2,
    name: '小红',
    age: 15
  },
  {
    id: 3,
    name: '小强',
    age: 19
  }
]

// 在实际业务中我们一般会拿到一个id的值去操作数据
// 例如 修改一条数据
const updateFunc = id => {
  arr = arr.map(item => {
    if(item.id === id) {
      item.name = '小新'
    }
    return item
  })
}
// 查找一个数据
const findItem = id => {
  const currentItem = arr.find(item => item.id === currentId)
  return currentItem
}
// 删除一个数据
const delFunc = id => {
  arr = arr.filter(item => item.id !== id)
}

如果我们去改变数组的数据格式呢,会不会变得简单一点

// array -> object
export function flattenArr(arr) {
  return arr.reduce((prve, item) => {
    prve[item.id] = item  //这里可以根据多传一个参数来复用 不一定是id  可以是uuid openid 等等根据项目
    return prve
  },{})
}
// object -> array 有些情况需要用到原数组
export function object2Arr(obj) {
  return Object.keys(obj).map(key => obj[key])
}

使用转换的数据操作

const obj = flattenArr(arr)
// 例如 修改一条数据
const updateFunc = id => {
  const updateItem = { obj[id], name: '小新' }
	obj = { ...obj, [id]: updateItem }
}
// 查找一个数据
const findItem = id => obj[id]
// 删除
const delFunc = id => {
  const { [id]: value, afterDelete } = obj
  arr = afterDelete
}

看着感觉没有简单多少, 但是在框架中, 我们需要遵循 immutable 原则 ,使用转换的数据更方便。