我的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;
}
答案 0 :(得分:1)
filter
有两个问题:
currentNonDimissedNotifications = currentActiveNotifications.filter(function (obj) {
for (var id in ids) {
return obj.id !== id;
}
});
它始终返回第一次检查结果;它永远不会进行后续检查,因为您无条件地使用return
。
您已使用for-in
,这意味着id
将成为每个条目的索引,而不是其值。有关循环数组的更多信息,以及for-in
在大多数情况下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;
});
在my answer here中不是正确的原因。
我们只想在找到匹配项(我们可以立即停止)或循环遍历整个ID数组时返回,并且我们想要正确循环。
所以它可能是:
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
&#13;
...但是数组有一个名为includes
的便捷函数,可以让我们检查一个值是否在一个数组中(较新版本的JavaScript也有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);
直播示例:
includes
&#13;
或使用较新的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);
直播示例:
subscriptions-transport-ws
&#13;
答案 1 :(得分:0)
你不应该使用for循环过滤对象,因为success
总是返回true,它也只检查第一个id。
尝试使用indexOf:
return obj.id !== id;