根据另一个对象中的键和属性从数组中删除对象

Remove objects from array based on keys & properties in another object?

本文关键字:属性 数组 对象 删除 一个对象      更新时间:2023-09-26

我有以下对象,其中属性键设置为用户名,属性值设置为它们出现的次数计数,以及一个包含属性为 UserIdUserName 的对象列表的数组:

peopleWhoAppear = { "Edward": 5, "Charlotte": 2, "Michael": 9, "Andy": 6 }
siteUsers = [ 
  { UserId: 1842, UserName: "Sam" }, 
  { UserId: 2943, UserName: "Charlotte" }, 
  { UserId: 1842, UserName: "Richard" },
  { UserId: 2916, UserName: "Ivan" },
  { UserId: 2073, UserName: "Paul" },
  { UserId: 1842, UserName: "Theo" }
  ...
]

我想从 siteUsers 数组中删除所有对象,如果属性值与某个数字(可能是 5 或 8)匹配,则UserNamepeopleWhoAppear对象中的属性键匹配,并将剩余结果返回给另一个数组。我已经在 6 天内坚持了 2 个小时,我没有取得任何进展。

我尝试过.filter.splice的不同排列和循环,但没有成功。例如:

 for (var UserName in peopleWhoAppear) {
   if (peopleWhoAppear[UserName ] === count) {
                siteUsers.filter(function (person) {
                    console.log(person);
                    return person.UserName !== verifier;
                }));
     }
 }

我怎样才能做到这一点?除了jQuery之外,我无法访问任何库,所以像Underscore这样的东西在这里没有用。

我尝试过.filter.splice的不同排列和循环,但没有成功。

您只需要filter

return siteUsers.filter(function(obj) {
    var user = obj.UserName;
    return !(user in peopleWhoAppear && peopleWhoAppear[user] == count);
});

这将为您提供一个新数组,其中包含未出现在peoplWhoAppear中或计数错误的所有用户。

Filter()不会

更改数组,而是返回一个新数组。如果要迭代筛选数组,则必须每次将其设置为 filter() 的返回值。

// copy the array
var newSiteUsers = siteUsers.slice(0)  
for (var UserName in peopleWhoAppear) {
   if (peopleWhoAppear[UserName ] === count) {
                newSiteUsers = newSiteUsers.filter(function (person) {
                    console.log(person);
                    return person.UserName !== UserName;
                }));
     }
 }
console.log(newSiteUsers);