gpt4 book ai didi

javascript - 基于动态值Javascript删除数组元素

转载 作者:行者123 更新时间:2023-12-03 04:44:31 27 4
gpt4 key购买 nike

我的 Ember 应用程序中有 2 个数组,一个数组保存一串 ID,另一个数组保存 Ember 对象。

我想将 Ember 对象发送到函数,从存储在浏览器中的 cookie 获取 ID 数组,然后如果 ID 属性与我的 IDS 数组中的字符串相对应,则过滤掉 Ember 对象。

我尝试为此使用过滤器,但每次它都只会带回 Ember 对象的完整列表,即使 ID 保存在 ID 字符串数组中也是如此。这是我的 Ember 组件中的代码..

init () {
this._super(...arguments);

this.get('userNotificationServices').fetchActiveUserNotifications().then(result => {
this.updatedArray = this.filterArray(result);
this.set('activeNotifications', result);
});

},

filterArray(currentActiveNotifications) {
var ids;
var currentNonDimissedNotifications;
if (this.getCookie("dismissed-notifications")) {
ids = this.getCookie("dismissed-notifications").split(',');
currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
for (var id in ids) {
return obj.id !== id;
}
});
}
return currentNonDimissedNotifications;
}

最佳答案

您的过滤器有两个问题:

currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
for (var id in ids) {
return obj.id !== id;
}
});
  1. 它总是返回第一次检查的结果;它永远不会进行后续检查,因为您无条件地使用 return

  2. 您使用了 for-in,这意味着 id 将是每个条目的索引,而不是其值。有关循环数组的更多信息,以及为什么 for-in 在大多数情况下都不正确,请参阅 my answer here .

我们只想在找到匹配项(我们可以立即停止)或循环遍历整个 ID 数组时返回,并且我们希望正确循环。

所以可能是:

currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
for (var i = 0; i < ids.length; ++i) { // Note loop
if (obj.id === ids[i]) {
// Found it, so we want to filter it out
return false;
}
}
// Didn't find it, so keep it
return true;
});

实例:

var currentActiveNotifications = [
{id: 1},
{id: 2},
{id: 3}
];
var ids = [2, 3];
var currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
for (var i = 0; i < ids.length; ++i) { // Note loop
if (obj.id === ids[i]) {
// Found it, so we want to filter it out
return false;
}
}
// Didn't find it, so keep it
return true;
});
console.log(currentNonDimissedNotifications);

...但是数组有一个名为 indexOf 的方便函数,可以让我们检查一个值是否在数组中(较新版本的 JavaScript 也有 includes)。所以我们可以使用它:

currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
return ids.indexOf(obj.id) === -1;
});

实例:

var currentActiveNotifications = [
{id: 1},
{id: 2},
{id: 3}
];
var ids = [2, 3];
var currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
return ids.indexOf(obj.id) === -1;
});
console.log(currentNonDimissedNotifications);

或者使用较新的包含:

currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
return !ids.includes(obj.id);
});

实例:

var currentActiveNotifications = [
{id: 1},
{id: 2},
{id: 3}
];
var ids = [2, 3];
var currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
return !ids.includes(obj.id);
});
console.log(currentNonDimissedNotifications);

关于javascript - 基于动态值Javascript删除数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42923592/

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