Arrays 淘汰树-获取树中的所有选定项
我有一个树状结构的客户端,我绑定到一个无序列表,每个客户端可能有也可能没有子客户端。我已经添加了在列表中选择项目的功能,但是现在我不知道如何在树中循环并获得所有选定项目的数组 特别是,这头野兽是我遇到问题的地方:Arrays 淘汰树-获取树中的所有选定项,arrays,knockout.js,Arrays,Knockout.js,我有一个树状结构的客户端,我绑定到一个无序列表,每个客户端可能有也可能没有子客户端。我已经添加了在列表中选择项目的功能,但是现在我不知道如何在树中循环并获得所有选定项目的数组 特别是,这头野兽是我遇到问题的地方: cp.GetSelectedClientsArray = function (clients) { var selected = []; ko.utils.arrayForEach(clients, function (item) { if (item.
cp.GetSelectedClientsArray = function (clients) {
var selected = [];
ko.utils.arrayForEach(clients, function (item) {
if (item.IsSelected()) {
selected.push(item.ClientName());
}
ko.utils.arrayForEach(item.SubClient(), function (subItem) {
if (subItem.IsSelected()) {
selected.push(subItem.ClientName());
}
cp.GetSelectedClientsArray(subItem);
});
});
console.log(selected);
return selected;
};
在切换IsSelected()observable之后,我想在列表中循环,得到一个只包含选定项的数组
这篇文章我已经写了好几次了,我真的需要一些帮助。我甚至不知道如何编写一个可以工作的递归函数,因为每次我从内部调用该函数时,它都会清除我的“selected”数组,并将其设置为全局变量,从而保留数组中曾经选择过的任何项
感谢您的帮助必须将选定的子项添加到父项选择中
ko.utils.arrayForEach(item.SubClient(), function (subItem) {
if (subItem.IsSelected()) {
selected.push(subItem.ClientName());
}
//cp.GetSelectedClientsArray(subItem);
selected.push.apply(selected, cp.GetSelectedClientsArray(subItem));
});
我希望这会有所帮助。必须将选定的子项添加到父项选择中
ko.utils.arrayForEach(item.SubClient(), function (subItem) {
if (subItem.IsSelected()) {
selected.push(subItem.ClientName());
}
//cp.GetSelectedClientsArray(subItem);
selected.push.apply(selected, cp.GetSelectedClientsArray(subItem));
});
我希望它能有所帮助。当您只需在视图模型上创建一个
SelectedClients
字段,并在切换时将其删除/添加到该字段中时,为什么要递归地在客户机列表上行走
例如:
_self.SelectedClients = ko.observableArray([]);
_self.ToggleSelectedUser = function (data, event) {
var toggle = !data.IsSelected();
data.IsSelected(toggle);
if (toggle)
_self.SelectedClients.push(data.ClientName());
else
_self.SelectedClients.remove(data.ClientName());
};
看
更新:
根据您的评论,当您确实需要在树上递归行走时,您可以尝试以下方法:
function AggregateSelectedClients(clients, results)
{
results = results || [];
if (!clients || !clients.length) return results;
ko.unwrap(clients).forEach(function(v, i)
{
var selected = ko.unwrap(v.IsSelected);
var subClients = ko.unwrap(v.SubClient);
if (selected)
results.push(ko.unwrap(v.ClientName));
if (subClients && subClients.length)
AggregateSelectedClients(subClients, results);
});
return results;
}
当您只需在视图模型上创建一个
SelectedClients
字段,并在切换时将其删除/添加到该字段中时,为什么要递归地遍历客户机列表
例如:
_self.SelectedClients = ko.observableArray([]);
_self.ToggleSelectedUser = function (data, event) {
var toggle = !data.IsSelected();
data.IsSelected(toggle);
if (toggle)
_self.SelectedClients.push(data.ClientName());
else
_self.SelectedClients.remove(data.ClientName());
};
看
更新:
根据您的评论,当您确实需要在树上递归行走时,您可以尝试以下方法:
function AggregateSelectedClients(clients, results)
{
results = results || [];
if (!clients || !clients.length) return results;
ko.unwrap(clients).forEach(function(v, i)
{
var selected = ko.unwrap(v.IsSelected);
var subClients = ko.unwrap(v.SubClient);
if (selected)
results.push(ko.unwrap(v.ClientName));
if (subClients && subClients.length)
AggregateSelectedClients(subClients, results);
});
return results;
}
如果我正确地理解了你想要做的事情,为什么不试试这样的事情呢
_self.SelectedClient = ko.observableArray();
_self.ToggleSelectedUser = function (data, event) {
var toggle = !data.IsSelected();
data.IsSelected(toggle);
if(toggle === true)
{
_self.SelectedClient.push(data.ClientName());
}
else
{
_self.SelectedClient.remove(data.ClientName());
}
如果我正确地理解了你想要做的事情,为什么不试试这样的事情呢
_self.SelectedClient = ko.observableArray();
_self.ToggleSelectedUser = function (data, event) {
var toggle = !data.IsSelected();
data.IsSelected(toggle);
if(toggle === true)
{
_self.SelectedClient.push(data.ClientName());
}
else
{
_self.SelectedClient.remove(data.ClientName());
}
这是递归版本
cp.GetSelectedClientsArray = function (clients) {
var result = [];
function GetSelected(clients){
for (var i in clients){
if(clients[i].IsSelected()){
result.push(clients[i].ClientName());
}
GetSelected(clients[i].SubClient());
}
}
GetSelected(clients);
console.log(result);
return result;
};
请参见这里的递归版本
cp.GetSelectedClientsArray = function (clients) {
var result = [];
function GetSelected(clients){
for (var i in clients){
if(clients[i].IsSelected()){
result.push(clients[i].ClientName());
}
GetSelected(clients[i].SubClient());
}
}
GetSelected(clients);
console.log(result);
return result;
};
请参见是否有理由在选择_self.ToggleSelectedUser函数时不将所选客户端添加/删除到可观察阵列?是否有理由在选择_self.ToggleSelectedUser函数时不将所选客户端添加/删除到可观察阵列?这解决了问题好的,谢谢。我知道在某个时刻,我将不得不迭代树中的每个项。有没有想过如何使用递归函数来实现这一点?这非常有用,但@GSerjo的答案正是我想要的。谢谢这解决了描述的问题,谢谢。我知道在某个时刻,我将不得不迭代树中的每个项。有没有想过如何使用递归函数来实现这一点?这非常有用,但@GSerjo的答案正是我想要的。谢谢这正是我想要的。谢谢这正是我想要的。谢谢