2016-10-28 32 views
0

我有我想拥有不可变的多维数组。但是我仍然不太确定我该如何使用多维不可变对象。使用复杂的不可变对象

比方说,我有类似这样的结构:

// 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 
+0

我编辑了我的问题。 – Michal

+1

看看使用的过滤器原型方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter 作为处理唯一对象,我想你的意思是独特的名字。在向数组添加待办事项之前,只需遍历它即可快速查看名称是否已存在?这不是最优的,但会起作用。如果你需要速度考虑一个不同的数据结构来存储待办事项。 –

回答

3

我相信你是混淆了两个相关的概念:immutability - 可以在JS使用VS Immutable.js的技术 - 库使前者容易。

下面是两者的一个例子(数据集被修正的位,以有效JS和为包括重复待办事项):

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>

docs Immutable.js。