仅当arr3
和username
中不存在给定的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
不是唯一的,并且需要删除arr3
中username: 'zed'
的所有对象。
有没有办法通过直接更改原始数组arr3
而无需单独复制来实现此目的?
答案 0 :(得分:0)
您可以使用CustomLog "|/usr/bin/rotatelogs -l /var/log/apache2/healthd/application.log.%Y-%m-%d-%H 3600" logformat
收集对象
Mozilla developer network说:
Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。
Set
答案 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个数组中的任何一个存在该元素名称,则删除它。
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;