如何使用Knockout.js从数组中删除重复对象
var ticketgroups = [
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup3, SortOrder: 3},
{TicketGroup: TicketGroup3, SortOrder: 3},
];
输出应为
var filltered = [
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup3, SortOrder: 3},
];
如何绑定我的视图
<select id="customticketgroup" data-bind="options: $root.filltered.TicketGroup"/>
如果SortOrder
应该是一个唯一的值,您可以使用它来过滤掉重复。下面的示例使用Map
来确保每个排序顺序只有一个值。
function uniquesBy(getKey, xs) {
return Array.from(
new Map(
xs.map(x => [getKey(x), x])
).values()
)
}
const TicketGroup1 = "Ticket Group 1";
const TicketGroup2 = "Ticket Group 2";
const TicketGroup3 = "Ticket Group 3";
const ticketgroups = [
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup3, SortOrder: 3},
{TicketGroup: TicketGroup3, SortOrder: 3},
];
ko.applyBindings({
filtered: uniquesBy(g => g.SortOrder, ticketgroups)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<select data-bind="
options: filtered,
optionsText: 'TicketGroup'
"></select>
如果您的ticketgroups数组实际上是一个observableArray
,那么您可以为filtered
使用pureComputed
。如果您只对排序后的TicketGroup
属性感兴趣,您可以链接.map(g => g.TicketGroup)
来提取值。
function uniquesBy(getKey, xs) {
return Array.from(
new Map(
xs.map(x => [getKey(x), x])
).values()
)
}
const TicketGroup1 = "Ticket Group 1";
const TicketGroup2 = "Ticket Group 2";
const TicketGroup3 = "Ticket Group 3";
const ticketgroups = ko.observableArray([
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup1, SortOrder: 1},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup2, SortOrder: 2},
{TicketGroup: TicketGroup3, SortOrder: 3},
{TicketGroup: TicketGroup3, SortOrder: 3},
]);
ko.applyBindings({
filtered: ko.pureComputed(() =>
uniquesBy(g => g.SortOrder, ticketgroups())
.map(g => g.TicketGroup)
)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<select data-bind="
options: filtered
"></select>