2016-07-05 4 views
1

У меня есть пустой массив и выбираемое дерево, и каждый раз, когда пользователь проверяет или отменяет проверку узла, я нажимаю идентификатор узла, и если флажок установлен true или ложный.Проверьте, существует ли объект в массиве до нажатия

Но прямо сейчас, если пользователь проверит и затем проверит узел, в массиве одного и того же узла будет два объекта, как я могу убедиться, что этого не произойдет?

//creating empty array 

var checkedItems = []; 

//(in kendo observable) on user selection I'm pushing the checked node to array 

onItemChecked : function (e) { 
    var node = e.sender.dataItem(e.node); 
    checkedItems.push({Id: node.Id, IsChecked: node.checked}); 
}, 

ответ

3

Вы можете перед тем, как нажать новый объект, проверить наличие объекта, имеющего этот идентификатор.

var el = checkedItems.filter(function(el) { 
    return el.Id === node.Id; 
}); 

if (el.length) { 
    el[0].IsChecked = node.checked; 
} else { 
    // push a new object 
} 
+1

@ManoDestra Спасибо за обновление моего лениво написанными ответ. – undefined

+0

Спасибо, все самое лучшее. – agDev

1

Вы можете просто использовать объект, который гарантированно иметь уникальные ключи:

var checkedItems = {}; 
onItemChecked : function (e) { 
    var node = e.sender.dataItem(e.node); 
    checkedItems[node.Id] = node.checked; 
}, 
+0

Остерегайтесь создания нового объекта здесь, так как '{}' && '{}' можно добавить дважды в Set – Endless

+0

Я использую решение Vohuman, мне нужна поддержка старых браузеров, спасибо! – agDev

+0

@Endless; Я не мог разобрать, что вы здесь говорили. Это связано с равенством ссылок на объекты? Возможно, вы правы ... Я возьму Set. –

1

У вас есть Id, который натереть, Потому что может быть использовано для уникальности. Поэтому, возможно, массив не подходит для того, чего вы хотите достичь. Есть лучший способ справиться с этим с помощью только простого объекта (см Майка McCaughan answer) и Map

var items = new Map 
items.set(node.Id, node.checked) 

// Removing items is as easy as 
items.remove(node.Id) 

// Getting 
var checked = items.get(node.Id) 

// Then if you want to iterate over them you would do something like: 
for (var [key, value] of items.entries()) { 
    console.log(key + " = " + value) 
} 

var values = items.values() 
var keys = items.keys() 

Карты являются как хранилище ключа/значения, так же, как объект

Смежные вопросы