gpt4 book ai didi

javascript - 查看数组是否包含对象的更好方法?

转载 作者:行者123 更新时间:2023-11-30 23:45:29 25 4
gpt4 key购买 nike

我有一个项目数组( terms) ,它将作为 <option> 标签放入 <select> 中。如果这些项目中的任何一个位于另一个数组( termsAlreadyTaking )中,则应首先将其删除。以下是我的做法:

    // If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add.
for (var i = 0; i < terms.length; i++)
{
for (var iAlreadyTaking = 0; iAlreadyTaking < termsAlreadyTaking.length; iAlreadyTaking++)
{
if (terms[i]['pk'] == termsAlreadyTaking[iAlreadyTaking]['pk'])
{
terms.splice(i, 1); // remove terms[i] without leaving a hole in the array
continue;
}
}
}

有更好的方法吗?感觉有点笨拙。

我正在使用 jQuery,如果它有什么不同的话。

更新基于@Matthew Flaschen 的回答:

// If the user has a term like "Fall 2010" already selected, we don't need that in the list of terms to add.
var options_for_selector = $.grep(all_possible_choices, function(elem)
{
var already_chosen = false;
$.each(response_chosen_items, function(index, chosen_elem)
{
if (chosen_elem['pk'] == elem['pk'])
{
already_chosen = true;
return;
}
});
return ! already_chosen;
});

中间变得更加冗长的原因是 $.inArray()返回 false,因为我正在查找的重复项在 == 中并不严格相等感觉。然而,它们的所有值都是相同的。我可以让这个更简洁吗?

最佳答案

var terms = $.grep(terms, function(el)
{
return $.inArray(el, termsAlreadyTaking) == -1;
});

这仍然具有 m * n 的性能(m 和 n 是数组的长度),但只要它们相对较小,就不应该有什么大问题。要获得 m + n,您可以使用哈希表

请注意,ECMAScript 提供了类似的数组。 filter和数组。 indexOf 。但是,它们尚未在所有浏览器中实现,因此您必须使用 MDC 实现作为后备。由于您使用的是 jQuery,因此 grep 和 inArray(在可用时使用 native indexOf)更容易。

编辑:

你可以这样做:

var response_chosen_pk = $.map(response_chosen_items, function(elem)
{
return elem.pk;
});
var options_for_selector = $.grep(all_possible_choices, function(elem)
{
return $.inArray(elem.pk, response_chosen_pk) == -1;
});

关于javascript - 查看数组是否包含对象的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3173780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com