Home > Software engineering >  Javascript sort array by date and alphabetical order
Javascript sort array by date and alphabetical order

Time:10-04

I want it to be sorted by date and alphabet in one sort how can i do that ? I think alphabetical order works good but date not works properly. Thanks for answers.

Data structure :

[{
    productId: 21,
    title: "Huawei P40 Lite ",
    brand: "Huawei",
    price: 120,
    discountPercentage: 10,
    color: "Black",
    createdDate: "2021-01-15T01:00:00 03:00",
  },
  {
    productId: 22,
    title: "Huawei P40 Lite",
    brand: "Huawei",
    price: 1026,
    discountPercentage: 0,
    color: "Green",
    createdDate: "2021-01-16T01:00:00 03:00",
  },
  {
    productId: 23,
    title: "Apple iPhone 11",
    brand: "Apple",
    price: 1220,
    discountPercentage: 11,
    color: "White",
    createdDate: "2021-01-17T01:00:00 03:00",
  },
 {
    productId: 24,
    title: "Apple iPhone 12",
    brand: "Apple",
    price: 1420,
    discountPercentage: 11,
    color: "White",
    createdDate: "2021-01-18T01:00:00 03:00",
  }],

Here my work :

    jsfiddle.net/pazyqb01/

And tried different solutions for sort date somehow i couldn't make it work.

Sorted Array shoul be like above :

 {
    productId: 24,
    title: "Apple iPhone 12",
    brand: "Apple",
    price: 1420,
    discountPercentage: 11,
    color: "White",
    createdDate: "2021-01-18T01:00:00 03:00",
  },
{
    productId: 23,
    title: "Apple iPhone 11",
    brand: "Apple",
    price: 1220,
    discountPercentage: 11,
    color: "White",
    createdDate: "2021-01-17T01:00:00 03:00",
  },
 {
    productId: 22,
    title: "Huawei P40 Lite",
    brand: "Huawei",
    price: 1026,
    discountPercentage: 0,
    color: "Green",
    createdDate: "2021-01-16T01:00:00 03:00",
  },
{
    productId: 21,
    title: "Huawei P40 Lite ",
    brand: "Huawei",
    price: 120,
    discountPercentage: 10,
    color: "Black",
    createdDate: "2021-01-15T01:00:00 03:00",
  },

CodePudding user response:

this way:

simply follow the list of your sorting criteria

const data = 
  [ { productId: 21, title: 'Huawei P40 Lite ', brand: 'Huawei', price:  120, discountPercentage: 10, color: 'Black', createdDate: '2021-01-15T01:00:00 03:00' } 
  , { productId: 22, title: 'Huawei P40 Lite',  brand: 'Huawei', price: 1026, discountPercentage: 0,  color: 'Green', createdDate: '2021-01-16T01:00:00 03:00' } 
  , { productId: 23, title: 'Apple iPhone 11',  brand: 'Apple',  price: 1220, discountPercentage: 11, color: 'White', createdDate: '2021-01-17T01:00:00 03:00' } 
  , { productId: 24, title: 'Apple iPhone 12',  brand: 'Apple',  price: 1420, discountPercentage: 11, color: 'White', createdDate: '2021-01-18T01:00:00 03:00' } 
  ] 

const fSort = (a,b) =>
  {
  let Dx = new Date(b.createdDate) - new Date(a.createdDate)     // 1st criteria
  if (Dx===0) Dx = a.title.trim().localeCompare(b.title.trim()) // 2nd

  // if (Dx===0) Dx = ... // 3rd
  // if (Dx===0) Dx = ... // 4th....
  return Dx
  }

console.log( data.sort(fSort))

CodePudding user response:

You should use Date.prototype.gettime() for comparing dates. Check this out:

const data = [
    {
    productId: 21,
    title: "Huawei P40 Lite ",
    brand: "Huawei",
    price: 120,
    discountPercentage: 10,
    color: "Black",
    createdDate: "2021-01-15T01:00:00 03:00",
  },
  {
    productId: 22,
    title: "Huawei P40 Lite",
    brand: "Huawei",
    price: 1026,
    discountPercentage: 0,
    color: "Green",
    createdDate: "2021-01-16T01:00:00 03:00",
  },
  {
    productId: 23,
    title: "Apple iPhone 11",
    brand: "Apple",
    price: 1220,
    discountPercentage: 11,
    color: "White",
    createdDate: "2021-01-17T01:00:00 03:00",
  },
 {
    productId: 24,
    title: "Apple iPhone 12",
    brand: "Apple",
    price: 1420,
    discountPercentage: 11,
    color: "White",
    createdDate: "2021-01-18T01:00:00 03:00",
  },
];

const parseDate = (date) => {
  return Date.parse(date);
};

console.log(data.sort((a,b)=>new Date(a.createdDate).getTime() - new Date(b.createdDate).getTime() &&
        (a["title"].toLowerCase() < b["title"].toLowerCase() ? -1 : 1)));

  • Related