Как отсортировать / упорядочить несколько объектов внутри массива?

#javascript #arrays #sorting

#javascript #массивы #сортировка

Вопрос:

Это мой вывод:

 const data = {
  item : {
   id: "1",
   name: "aa", 
   group: [
    {
      id:"11",
      order:0,
    },
    {
      id:"33",
      order:5,
    },
    {
      id:"3",
      order:1,
    },    
   ] 
  },

  item2 : {
   id: "2",
   name: "aaa", 
   group: [
    {
      id:"111",
      order:3,
    },
    {
      id:"33",
      order:1,
    },
    {
      id:"3",
      order:2,
    },    
   ] 
  }
}
  

Я хочу упорядочить свой group объект по order элементам. Если бы это был объект, я мог бы это сделать:

 data.group.sort((a, b) => {
  return a.order - b.order || a.order.localeCompare(b.order);
});
  

Но это переопределит элементы, и я получу только самый последний элемент. Я считаю, что чего-то еще не хватает, чтобы заставить его работать так, как я хочу.

Это желаемый результат:

 const data = {
  item : {
    id: "1",
    name: "aa", 
    group: [
    {
      id:"11",
      order:0,
    },
    {
      id:"3",
      order:1,
    },
    {
      id:"33", 
      order:5, 
    },    
    ] 
  },

  item2 : {
    id: "2",
    name: "aaa", 
    group: [
    {
      id:"33", 
      order:1, 
    },
    {
      id:"3", 
      order:2,
    },
    {
      id:"111", 
      order:3, 
    },    
    ] 
  }
}
  

Как я могу это сделать?

Ответ №1:

Попробуйте этот код:

 const data = {
  item : {
   id: "1",
   name: "aa", 
   group: [
    {
      id:"11",
      order:0,
    },
    {
      id:"33",
      order:5,
    },
    {
      id:"3",
      order:1,
    },    
   ] 
  },

  item2 : {
   id: "2",
   name: "aaa", 
   group: [
    {
      id:"111",
      order:3,
    },
    {
      id:"33",
      order:1,
    },
    {
      id:"3",
      order:2,
    },    
   ] 
  }
}

Object.keys(data).forEach(key => {
  const item = data[key];
  item.group = item.group.sort((a, b) => {
    return a.order - b.order || a.order.localeCompare(b.order);
  });
  
  return item;
});

console.log(data);  

Ответ №2:

Сделайте это (ЗАСЛУГА: flymaster)

 Object.keys(dataINPT).forEach(key => {
const your = dataINPT[key];
your.group = your.group.sort((some, some2) => {
return some.order - some2.order || some.order.localeCompare(some2.order);
});

return your;
});

console.log(data);
  

Ответ №3:

Используйте Object.values , forEach цикл и примените сортировку.

 Object.values(data).forEach(({ group }) =>
  group.sort((a, b) => {
    return a.order - b.order || a.order.localeCompare(b.order);
  })
);
  

 const data = {
  item: {
    id: "1",
    name: "aa",
    group: [
      {
        id: "11",
        order: 0,
      },
      {
        id: "33",
        order: 5,
      },
      {
        id: "3",
        order: 1,
      },
    ],
  },

  item2: {
    id: "2",
    name: "aaa",
    group: [
      {
        id: "111",
        order: 3,
      },
      {
        id: "33",
        order: 1,
      },
      {
        id: "3",
        order: 2,
      },
    ],
  },
};

Object.values(data).forEach(({ group }) =>
  group.sort((a, b) => {
    return a.order - b.order || a.order.localeCompare(b.order);
  })
);

console.log(data);