[英]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()
並將累加器設置為空對象{}
id
和postedUserId
是單獨的變量。 並使用傳播運算符獲取其余屬性。 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,否則不添加 postedUserId
推postedUserId
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.