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

时间:2017-03-21 09:54:33

标签: javascript arrays ember.js

我的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;
}

2 个答案:

答案 0 :(得分:1)

filter有两个问题:

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

  2. 您已使用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中不是正确的原因。

  3. 我们只想在找到匹配项(我们可以立即停止)或循环遍历整个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);

    直播示例:

    &#13;
    &#13;
    indexOf
    &#13;
    &#13;
    &#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);

    直播示例:

    &#13;
    &#13;
    includes
    &#13;
    &#13;
    &#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);

    直播示例:

    &#13;
    &#13;
    subscriptions-transport-ws
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

你不应该使用for循环过滤对象,因为success总是返回true,它也只检查第一个id。

尝试使用indexOf:

return obj.id !== id;