如果另一个数组中不存在对象值,则从原始数组中删除对象

时间:2018-02-11 19:50:59

标签: javascript arrays

仅当arr3username中不存在给定的arr1时,我才会尝试从arr2删除对象。

var arr1 = [{ id: 1, username: 'fred'}, 
            { id: 2, username: 'bill'},
            { id: 3, username: 'red'} ];

var arr2 = [{ id: 1, username: 'fred'},
            { id: 2, username: 'ted'},
            { id: 3, username: 'bed'} ];

var arr3 = [{ id: 1, username: 'fred'}, 
            { id: 2, username: 'zed'},
            { id: 3, username: 'zed'} ];


function removeElement(name){
    var found1 = arr1.some(function (element) {
        return element.username == name;  
    });
    var found2 = arr2.some(function (element){
        return element.username == name;
    });

    if (!found1 && !found2){
        for (var i = 0, n = arr3.length; i < n; i++){
            if (arr3[i].username == name){
                arr3.splice(i, 1);    
            }
        }
    }
};


removeElement('zed');

/*
Exception: TypeError: arr3[i] is undefined
removeElement@Scratchpad/6:24:1
@Scratchpad/6:32:1
*/

我得到这个TypeError,我假设是因为我在for循环中改变了arr3的长度。我可以在break方法之后添加splice语句,但username不是唯一的,并且需要删除arr3username: 'zed'的所有对象。

有没有办法通过直接更改原始数组arr3而无需单独复制来实现此目的?

4 个答案:

答案 0 :(得分:0)

您可以使用CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/healthd/application.log.%Y-%m-%d-%H 3600" logformat 收集对象 Mozilla developer network说:

  

Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。

Set

请参阅:«Relation with array objects»

答案 1 :(得分:0)

更改

if (!found1 && !found2){
    for (var i = 0, n = arr3.length; i < n; i++){
        if (arr3[i].username == name){
            arr3.splice(i, 1);    
        }
    }
}

if (!found1 && !found2){
    for (var i = arr3.length-1; i >= 0; i--){
        if (arr3[i].username == name){
            arr3.splice(i, 1);    
        }
    }
}

拼接时,你总是希望以相反的顺序进行拼接,因为你缩短了数组,每次拼接就像说i = i + 2,因为你删除的当前元素现在是列表中的下一个元素。 / p>

答案 2 :(得分:0)

并不是更好,如果你发现它重复索引并检查有关undefined是否不同的值。我认为这是最简单的,你不会给函数带来更多的复杂性

if (!found1 && !found2){
        for (var i = 0, n = arr3.length; i < n; i++){
          console.log(i);
          console.log(arr3)
            if ((typeof arr3[i] != 'undefined') && arr3[i].username == name){
                arr3.splice(i, 1);
                i--;
            }
        }
    }

答案 3 :(得分:0)

功能编程风格 易于阅读+理解。请享用。 array#过滤谓词上的原始数组,如果其他2个数组中的任何一个存在该元素名称,则删除它。

&#13;
&#13;
var arr1 = [{ id: 1, username: 'fred'}, 
            { id: 2, username: 'bill'},
            { id: 3, username: 'red'} ];

var arr2 = [{ id: 1, username: 'fred'},
            { id: 2, username: 'ted'},
            { id: 3, username: 'bed'} ];

var arr3 = [{ id: 1, username: 'fred'}, 
            { id: 2, username: 'zed'},
            { id: 3, username: 'zed'} ];


var filtered = arr1.filter((person) => {
    return !(
        arr2.some((ele) => ele.username === person.username) || 
        arr3.some((ele) => ele.username === person.username)
    )
})


console.log(filtered)
&#13;
&#13;
&#13;