【问题标题】:Working with complicated immutable objects处理复杂的不可变对象
【发布时间】:2016-10-28 01:03:30
【问题描述】:

我有一个不可变的多维数组。但是我仍然不太确定我应该如何处理多维不可变对象。

假设我的结构类似于这个:

// data
{
    // item
    {
        name: someName,
        todos: [
            { id: 1, name: todoName },
            { id: 2, name: todoName2 }
        ]
    }
}

如何提取唯一的待办事项列表?

// Saving todos
let uniqueTodos = []
// Saving ids of todos
let saved = []

// I want to make data immutable list
data.forEach(item => {
  item.todos.forEach(todo => {
    if (saved.indexOf(todo.id) === -1) {
      saved.push(todo.id)
      todos.push(todo)
    }
  })

})
return todos

【问题讨论】:

  • 我编辑了我的问题。
  • 看看使用过滤器原型方法developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…至于处理唯一的对象,我假设你的意思是名称唯一的。在向数组添加待办事项之前,只需快速迭代它以查看名称是否已经存在?这不是最佳的,但会起作用。如果您需要速度,请考虑使用不同的数据结构来存储待办事项。

标签: javascript reactjs redux immutability immutable.js


【解决方案1】:

我相信你混淆了两个相关的概念:immutability - 一种可以在 JS 中使用的技术 vs Immutable.js - 一个使前者变得简单的库。

以下是两者的示例(数据集已稍微修正为有效的 JS 并包含重复的 todo):

const data = {
  item: {
    name: 'someName',
    todos: [
      { id: 1, name: 'todoName' },
      { id: 2, name: 'todoName2' },
      { id: 2, name: 'todoName2' },
    ],
  },
}


console.info(
  'immutable unique todos:',
  data.item.todos.map((todo) => ({ ...todo, }))
)

console.info(
  'Immutable.js unique todos:',
  Immutable.fromJS(data).getIn(['item', 'todos']).toSet().toJS()
)
<script src="https://cdn.jsdelivr.net/immutable.js/3.8.1/immutable.min.js"></script>

Immutable.js docs.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多