簡體   English   中英

在JavaScript中過濾對象數組

[英]Filter array of object in javascript

我正在使用JavaScript創建一個項目。 在過濾對象數組時,我陷入了問題:這是數組:

var arr1 = [{
      "name": "harkaran",
      "lname": "sofat",
      "userId": 49,
     "postedUserId": 52,
      "id": 21,

    },{
      "name": "harkaran",
      "lname": "sofat",
      "userId": 49,
      "postedUserId": 57,
      "id": 21,
    }]

最終數組應如下所示:

[{
    "name": "harkaran",
      "lname": "sofat",
      "userId": 49,
     "postedUserId": 52,
      "id": 21,
      postedUsers:[52,57]
}] 

我正在嘗試創建新對象。 這是我正在使用的方法。但是不知道如何實現此變量var arr = [] let obj = {}

        obj['name'] = "";
        obj['lname'] = "";
        obj['userId'] = "";
        obj['postedUserId'] = "";
        obj['id'] = "";
        obj['postedUsers'] = [];
        arr.push(obj);

        for(var i=0; i<arr1.length; i++){


         }

使用reduce

 var arr1 = [{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":52,"id":21,},{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":57,"id":21,}]; const res = Object.values(arr1.reduce((acc, { postedUserId, name, ...rest }) => { acc[name] = acc[name] || { name, ...rest, postedUserId, postedUsers: [] }; acc[name].postedUsers = [].concat(acc[name].postedUsers, postedUserId); return acc; }, {})); console.log(res); 
 .as-console-wrapper { max-height: 100% !important; top: auto; } 

首先,這不稱為過濾。 其稱為分組 您可以按照以下步驟進行操作:

  • 首先在數組上使用reduce()並將累加器設置為空對象{}
  • 在每次迭代過程中,使用Destructuring獲取idpostedUserId是單獨的變量。 並使用傳播運算符獲取其余屬性。
  • 然后檢查累加器中是否已經存在當前id的項目。
  • 如果存在,則將postedUserId推送到其postedUsers數組。
  • 如果該鍵不存在,則將累加器上的鍵( id )設置為一個對象, postedUsers作為空數組。

 var arr1 = [{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":52,"id":21,},{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":57,"id":21,}]; const res = arr1.reduce((ac,{id,postedUserId,...rest}) => { if(!ac[id]) ac[id] = {id,postedUserId,postedUsers:[],...rest}; ac[id].postedUsers.push(postedUserId); return ac; },{}) console.log(Object.values(res)) 

您在注釋中詢問了簡單的for循環,所以這是該版本。

 var arr1 = [{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":52,"id":21,},{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":57,"id":21,}]; let res = {}; for(let i = 0; i<arr1.length; i++){ let {id,postedUserId,...rest} = arr1[i]; if(!res[id]) res[id] = {id,postedUserId,postedUsers:[],...rest}; res[id].postedUsers.push(postedUserId); } console.log(Object.values(res)) 

您可以使用reduce和分組postedUser並保留第一個postedUserId

  • 首先循環遍歷arr1數組,並使用id作為我們要構建的對象的鍵
  • 首先,如果object已具有值,則檢查postedUserId如果不存在,則檢查postedUserId添加當前ID,否則不添加
  • 現在將postedUserIdpostedUserId postedUser
  • 從最終獲得值

 var arr1 = [{"name": "harkaran","lname": "sofat","userId": 49,"postedUserId": 52,"id": 21,}, {"name": "harkaran","lname": "sofat","userId": 49,"postedUserId": 57,"id": 21,}] let final = arr1.reduce((op,{id,...rest})=>{ let postedUserId = rest.postedUserId if(op[id] && op[id].postedUserId){ delete rest.postedUserId } op[id] = op[id] || {...rest,postedUser:[]} op[id].postedUser.push(postedUserId) return op },{}) console.log(Object.values(final)) 

我會使用臨時Map進行分組。

 var arr1 = [{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":52,"id":21,},{"name":"harkaran","lname":"sofat","userId":49,"postedUserId":57,"id":21,}]; const map = new Map(arr1.map(o => [o.id, { ...o, postUsersId: [] }])); arr1.forEach(o => map.get(o.id).postUsersId.push(o.postedUserId)); const res = [...map.values()]; console.log(res); 

這將優先使用最后一次出現相同ID的數據。 如果您希望第一個具有優先級,則只需反轉數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM