[英]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.