Фильтровать массив объектов в JavaScript - PullRequest
1 голос
/ 09 июня 2019

Я создаю проект с использованием 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++){


         }

Ответы [ 4 ]

1 голос
/ 09 июня 2019

Прежде всего это не называется фильтрацией.Это называется группировка .Вы можете сделать это в следующих шагах:

  • Сначала использовать reduce() для массива и установить аккумулятор в пустой объект {}
  • Во время каждой итерации получать id и postedUserId это отдельная переменная, использующая Destructuring.И используйте оператор распространения, чтобы получить остальные свойства.
  • Затем проверьте, есть ли уже элемент текущего тока 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))
1 голос
/ 09 июня 2019

Использование 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; }
0 голосов
/ 09 июня 2019

Я бы использовал временную 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);

Это даст приоритет данным, данным с last вхождением того же идентификатора. Если вы хотите, чтобы first имел приоритет, то просто измените массив

0 голосов
/ 09 июня 2019

Вы можете использовать уменьшить и сгруппировать postedUser и оставить первый postedUserId

  • Первый цикл по массиву arr1 и использование id в качестве ключа для объекта, который мы строим
  • Сначала мы проверяем идентификатор, если object уже имеет значение, а затем проверяем 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...