เรียงลำดับอาร์เรย์ของวัตถุด้วยปุ่มเดียวพร้อมค่าวันที่


257

ฉันมีอาเรย์ของวัตถุที่มีคู่ค่าคีย์หลายคู่และฉันต้องการเรียงลำดับตาม 'updated_at':

[
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }
]

วิธีที่มีประสิทธิภาพที่สุดในการทำคืออะไร?


@Topener ลิงก์นั้นดูเหมือนคำถามเกี่ยวกับ PHP
David Brainer

ความผิดพลาดของฉัน .. ไม่สามารถอ่านได้อย่างถูกต้อง
เรเน่พอท

คำตอบ:


338

Array.sortคุณสามารถใช้

นี่คือตัวอย่าง:

var arr = [{
    "updated_at": "2012-01-01T06:25:24Z",
    "foo": "bar"
  },
  {
    "updated_at": "2012-01-09T11:25:13Z",
    "foo": "bar"
  },
  {
    "updated_at": "2012-01-05T04:13:24Z",
    "foo": "bar"
  }
]

arr.sort(function(a, b) {
  var keyA = new Date(a.updated_at),
    keyB = new Date(b.updated_at);
  // Compare the 2 dates
  if (keyA < keyB) return -1;
  if (keyA > keyB) return 1;
  return 0;
});

console.log(arr);


17
คุณไม่สามารถใช้keyA - keyB(หรืออาจจะkeyB - keyA)? วัตถุวันที่มีvalueOf()วิธีการ
soktinpk

ส่งคืน updated_at <b update_at? 1: -1 ใช้ได้สำหรับฉัน ไม่จำเป็นต้องแยกวิเคราะห์ในรูปแบบวันที่
oliversisson

ความสามารถในการทำa-bมีความสำคัญจริง ๆ ถ้าคุณต้องการหลีกเลี่ยงรหัสยาว ในขณะที่รหัสยาวไม่จำเป็นต้องแย่ในกรณีนี้ฉันคิดว่าการใช้คำฟุ่มเฟือยทำให้การเข้าใจยากขึ้น ฉันใช้values.sort((a,b)=>a.attr-b.attr)อยู่ ต้องเขียน 5 บรรทัดทุกครั้งที่คุณจำเป็นต้องเรียงลำดับอาเรย์กลายเป็นน่าเบื่อ
AnnanFay

ตัวอย่างนี้ไม่มีประสิทธิภาพและทำการคำนวณที่ไม่จำเป็นจำนวนมาก การเรียงลำดับสามารถใช้จำนวนบวกหรือลบใด ๆ ได้ตามผลลัพธ์ การคำนวณพิเศษของคุณเพื่อบังคับให้เป็น 1,0, -1 ไม่จำเป็นและเพิ่มการคำนวณพิเศษต่อการดำเนินการ
Patrick W. McMahon

ทำงานได้ดีมากขอขอบคุณคุณ
Andy

158

ฉันตอบคำถามที่คล้ายกันจริงๆแล้วที่นี่: ฟังก์ชั่นง่าย ๆ ในการจัดเรียงอาร์เรย์ของวัตถุ

สำหรับคำถามที่ฉันสร้างฟังก์ชั่นเล็ก ๆ นี้ที่อาจทำสิ่งที่คุณต้องการ:

function sortByKey(array, key) {
    return array.sort(function(a, b) {
        var x = a[key]; var y = b[key];
        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
}

11
คุณครับเป็นผู้ชาย blogs.citypages.com/blotter/assets_c/2009/02/...
Dom

2
คุณจะกลับรายการนี้ได้อย่างไร

4
ในการทำให้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณสามารถเพิ่มตัวแปร. toLowerCase () ไปยังตัวแปร x และ y ได้
Jacob van Lingen

4
ที่จะย้อนกลับฟังก์ชั่นการเรียงลำดับเช่นนี้เพียงแค่คูณผลโดย-1:)
Svish

5
หรือเพียงแค่เอาท์พุทและใช้array = array.reverse()ฟังก์ชั่น
ลุคสตีเวนสัน

31

กระบวนการArray.sort ()วิธีการเรียงลำดับองค์ประกอบของอาร์เรย์ในสถานที่และส่งกลับอาร์เรย์ ระมัดระวังกับArray.Sort ()ในขณะที่มันไม่ได้เปลี่ยนรูป สำหรับการใช้งานเรียงลำดับไม่เปลี่ยนรูปเปลี่ยนรูปเรียงลำดับ

วิธีนี้คือการจัดเรียงอาร์เรย์โดยใช้ค่าปัจจุบันของคุณupdated_atในรูปแบบ ISO เราใช้new Data(iso_string).getTime()ในการแปลงเวลา ISO เป็น Unix timestamp Unix Timestamp เป็นตัวเลขที่เราสามารถทำคณิตศาสตร์ได้ง่าย เราลบการประทับเวลาครั้งแรกและครั้งที่สองผลที่ได้คือ; หากการประทับเวลาแรกมากกว่าครั้งที่สองหมายเลขส่งคืนจะเป็นค่าบวก หากตัวเลขที่สองมากกว่าจำนวนแรกค่าส่งคืนจะเป็นค่าลบ หากทั้งสองเหมือนกันผลตอบแทนจะเป็นศูนย์ สิ่งนี้จะกำหนดอย่างสมบูรณ์แบบด้วยค่าส่งคืนที่ต้องการสำหรับฟังก์ชันอินไลน์

สำหรับES6 :

arr.sort((a,b) => new Date(a.updated_at).getTime() - new Date(b.updated_at).getTime());

สำหรับES5 :

arr.sort(function(a,b){ 
 return new Date(a.updated_at).getTime() - new Date(b.updated_at).getTime();
});

หากคุณเปลี่ยนupdated_atเป็นเวลาประทับยูนิกซ์คุณสามารถทำสิ่งนี้ได้:

สำหรับES6 :

arr.sort((a,b) => a.updated_at - b.updated_at);

สำหรับES5 :

arr.sort(function(a,b){ 
 return a.updated_at - b.updated_at;
});

ในขณะที่โพสต์นี้เบราว์เซอร์ที่ทันสมัยไม่รองรับ ES6 ในการใช้ ES6 ในเบราว์เซอร์รุ่นใหม่ให้ใช้babelเพื่อส่งรหัสเป็น ES5 คาดว่าการสนับสนุนเบราว์เซอร์สำหรับ ES6 ในอนาคตอันใกล้

Array.sort ()ควรรับค่าตอบแทนเป็นหนึ่งใน 3 ผลลัพธ์ที่เป็นไปได้:

  • จำนวนบวก (รายการแรก> รายการที่สอง)
  • จำนวนลบ (รายการแรก <รายการที่สอง)
  • 0 ถ้าทั้งสองรายการเท่ากัน

โปรดทราบว่าค่าส่งคืนในฟังก์ชั่นอินไลน์สามารถเป็นจำนวนบวกหรือลบใด ๆ Array.Sort () ไม่สนใจว่าหมายเลขส่งคืนคืออะไร จะสนใจก็ต่อเมื่อค่าส่งคืนเป็นค่าบวกลบหรือศูนย์

สำหรับการจัดเรียงที่ไม่เปลี่ยนรูป: (ตัวอย่างใน ES6)

const sort = require('immutable-sort');
const array = [1, 5, 2, 4, 3];
const sortedArray = sort(array);

คุณสามารถเขียนด้วยวิธีนี้:

import sort from 'immutable-sort';
const array = [1, 5, 2, 4, 3];
const sortedArray = sort(array);

การนำเข้าจากที่คุณเห็นเป็นวิธีใหม่ในการรวม javascript ใน ES6 และทำให้โค้ดของคุณดูสะอาดตา ฉันชอบส่วนตัว

การเรียงลำดับไม่เปลี่ยนรูปไม่ได้เปลี่ยนอาเรย์ของแหล่งข้อมูลแทนที่จะส่งคืนอาเรย์ใหม่ ใช้constเป็นที่แนะนำเกี่ยวกับข้อมูลการเปลี่ยนรูป


19

ต่อไปนี้เป็นรุ่นที่แก้ไขเล็กน้อยของ@David Brainer-Bankers ตอบว่าเรียงลำดับตัวอักษรตามสายอักขระหรือตัวเลขโดยตัวเลขและทำให้มั่นใจว่าคำที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่ไม่เรียงลำดับเหนือคำที่ขึ้นต้นด้วยอักษรตัวพิมพ์เล็ก (เช่น "apple, Early") จะแสดงตามลำดับ)

function sortByKey(array, key) {
    return array.sort(function(a, b) {
        var x = a[key];
        var y = b[key];

        if (typeof x == "string")
        {
            x = (""+x).toLowerCase(); 
        }
        if (typeof y == "string")
        {
            y = (""+y).toLowerCase();
        }

        return ((x < y) ? -1 : ((x > y) ? 1 : 0));
    });
}

3
วิธีแก้ปัญหาที่เสนออาจให้ข้อผิดพลาดหาก [คีย์] และ b [คีย์] ไม่ใช่ทั้งสองสตริง ฉันแนะนำให้แทนที่ y = y.toLowerCase () ด้วย y = ("" + y) .toLowerCase ()
user8074

การเรียงลำดับสามารถยอมรับจำนวนบวกหรือลบใด ๆ เป็นการส่งคืนที่ถูกต้อง คุณกำลังคำนวณพิเศษเพื่อบังคับให้เป็น 1,0 ไม่จำเป็นต้องใช้ -1 คุณซับซ้อนเกินมูลค่าส่งคืนอย่างง่าย เป็นการดีที่สุดที่จะไม่เพิ่มการคำนวณพิเศษที่ไม่ทำอะไรเลย
Patrick W. McMahon

15

ใช้เครื่องหมายขีดล่าง js หรือ lodash

var arrObj = [
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }
];

arrObj = _.sortBy(arrObj,"updated_at");

_.sortBy() ส่งกลับอาร์เรย์ใหม่

อ้างอิงhttp://underscorejs.org/#sortByและ lodash docs https://lodash.com/docs#sortBy


6

ด้วยการสนับสนุน ES2015 สามารถทำได้โดย:

foo.sort((a, b) => a.updated_at < b.updated_at ? -1 : 1)

1
ไม่จำเป็นต้องใช้อินไลน์หากแทนที่ <ด้วย - และลบ '? -1: 1 "คุณจะได้รับผลตอบแทนที่ถูกต้องตัวอย่างนี้ย้ายรายการที่อาจเท่ากันและอาจให้ผลลัพธ์ที่ไม่คาดคิดสำหรับรายการที่เท่ากับ 0 ควรส่งคืน
Patrick W. McMahon

ขอบคุณสำหรับการอธิบาย
รู้

ถ้า updated_at เป็นเวลา ISO สิ่งนี้จะไม่ทำงาน ตัวอย่างนี้ถือว่า Unix timestamps แต่ OP ได้โพสต์ข้อมูลที่อยู่ในรูปแบบ ISO ดังนั้นคุณจะต้องแปลงเป็นเวลา Unix เพื่อทำการเปรียบเทียบ ซึ่งสามารถทำได้ด้วยnew Date(iso_str).getTime()สิ่งนี้จะส่งคืนเวลา Unix
Patrick W. McMahon

5

นำเข้าข้อมูลแล้ว

[
    {
        "gameStatus": "1",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-20 11:32:04"
    },
    {
        "gameStatus": "0",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 18:08:24"
    },
    {
        "gameStatus": "2",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 18:35:40"
    },
    {
        "gameStatus": "0",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 10:42:53"
    },
    {
        "gameStatus": "2",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-20 10:54:09"
    },
    {
        "gameStatus": "0",
        "userId": "1a2fefb0-5ae2-47eb-82ff-d1b2cc27875a",
        "created_at": "2018-12-19 18:46:22"
    },
    {
        "gameStatus": "1",
        "userId": "7118ed61-d8d9-4098-a81b-484158806d21",
        "created_at": "2018-12-20 10:50:48"
    }
]

สำหรับการสั่งซื้อน้อยไปมาก

arr.sort(function(a, b){
    var keyA = new Date(a.updated_at),
        keyB = new Date(b.updated_at);
    // Compare the 2 dates
    if(keyA < keyB) return -1;
    if(keyA > keyB) return 1;
    return 0;
});

ตัวอย่างการสั่งซื้อ Asc

[
    {
        "gameStatus": "0",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 10:42:53"
    },
    {
        "gameStatus": "0",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 18:08:24"
    },
    {
        "gameStatus": "2",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 18:35:40"
    },
    {
        "gameStatus": "0",
        "userId": "1a2fefb0-5ae2-47eb-82ff-d1b2cc27875a",
        "created_at": "2018-12-19 18:46:22"
    },
    {
        "gameStatus": "1",
        "userId": "7118ed61-d8d9-4098-a81b-484158806d21",
        "created_at": "2018-12-20 10:50:48"
    },
    {
        "gameStatus": "2",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-20 10:54:09"
    },
    {
        "gameStatus": "1",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-20 11:32:04"
    }
]

สำหรับเรียงลำดับมากไปน้อย

arr.sort(function(a, b){
    var keyA = new Date(a.updated_at),
        keyB = new Date(b.updated_at);
    // Compare the 2 dates
    if(keyA > keyB) return -1;
    if(keyA < keyB) return 1;
    return 0;
});

ตัวอย่างการเรียงลำดับ

[
    {
        "gameStatus": "1",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-20 11:32:04"
    },
    {
        "gameStatus": "2",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-20 10:54:09"
    },
    {
        "gameStatus": "1",
        "userId": "7118ed61-d8d9-4098-a81b-484158806d21",
        "created_at": "2018-12-20 10:50:48"
    },
    {
        "gameStatus": "0",
        "userId": "1a2fefb0-5ae2-47eb-82ff-d1b2cc27875a",
        "created_at": "2018-12-19 18:46:22"
    },
    {
        "gameStatus": "2",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 18:35:40"
    },
    {
        "gameStatus": "0",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 18:08:24"
    },
    {
        "gameStatus": "0",
        "userId": "c02cfb18-ae66-430b-9524-67d9dd8f6a50",
        "created_at": "2018-12-19 10:42:53"
    }
]

3

ในฐานะที่เป็นนี้Array.sortคำตอบคือรัฐคุณสามารถใช้

arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})

arr = [
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }
];
arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)});
console.log(arr);


2

อีกวิธีหนึ่งทางคณิตศาสตร์มากขึ้นวิธีการทำสิ่งเดียวกัน แต่สั้นกว่า :

arr.sort(function(a, b){
    var diff = new Date(a.updated_at) - new Date(b.updated_at);
    return diff/(Math.abs(diff)||1);
});

หรือในสไตล์ลูกศรแลมบ์ดาเรียบ:

arr.sort((a, b) => {
    var diff = new Date(a.updated_at) - new Date(b.updated_at);
    return diff/(Math.abs(diff)||1);
});

วิธีนี้สามารถทำได้กับอินพุตตัวเลขใด ๆ


คำตอบที่ไม่ครบถ้วน
two7s_clash

2

สำหรับวันนี้คำตอบของ @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) และ @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) สามารถรวมกันเพื่อให้การสนับสนุน ES2015 และการจัดการวันที่ที่ถูกต้อง:

arr.sort((a, b) => {
   const dateA = new Date(a.updated_at);
   const dateB = new Date(b.updated_at);
   return dateA - dateB;
});

2

ฉันได้สร้างฟังก์ชั่นการเรียงลำดับใน typescript ซึ่งเราสามารถใช้เพื่อค้นหาสตริงวันที่และตัวเลขในอาร์เรย์ของวัตถุ นอกจากนี้ยังสามารถเรียงลำดับได้หลายช่อง

export type SortType = 'string' | 'number' | 'date';
export type SortingOrder = 'asc' | 'desc';

export interface SortOptions {
  sortByKey: string;
  sortType?: SortType;
  sortingOrder?: SortingOrder;
}


class CustomSorting {
    static sortArrayOfObjects(fields: SortOptions[] = [{sortByKey: 'value', sortType: 'string', sortingOrder: 'desc'}]) {
        return (a, b) => fields
          .map((field) => {
            if (!a[field.sortByKey] || !b[field.sortByKey]) {
              return 0;
            }

            const direction = field.sortingOrder === 'asc' ? 1 : -1;

            let firstValue;
            let secondValue;

            if (field.sortType === 'string') {
              firstValue = a[field.sortByKey].toUpperCase();
              secondValue = b[field.sortByKey].toUpperCase();
            } else if (field.sortType === 'number') {
              firstValue = parseInt(a[field.sortByKey], 10);
              secondValue = parseInt(b[field.sortByKey], 10);
            } else if (field.sortType === 'date') {
              firstValue = new Date(a[field.sortByKey]);
              secondValue = new Date(b[field.sortByKey]);
            }
            return firstValue > secondValue ? direction : firstValue < secondValue ? -(direction) : 0;

          })
          .reduce((pos, neg) => pos ? pos : neg, 0);
      }
    }
}

การใช้งาน:

const sortOptions = [{
      sortByKey: 'anyKey',
      sortType: 'string',
      sortingOrder: 'asc',
    }];

arrayOfObjects.sort(CustomSorting.sortArrayOfObjects(sortOptions));

1

การเรียงลำดับตามวันที่ในรูปแบบ ISO อาจมีราคาแพงเว้นแต่คุณจะ จำกัด ลูกค้าไว้ที่เบราว์เซอร์ล่าสุดและดีที่สุดซึ่งสามารถสร้างการประทับเวลาที่ถูกต้องโดยการแยกวันที่สตริง

หากคุณแน่ใจว่าข้อมูลของคุณและคุณรู้ว่ามันจะเป็น yyyy-mm-ddThh: mm: ss และ GMT (Z) คุณสามารถแยกตัวเลขจากสมาชิกแต่ละคนและเปรียบเทียบเป็นจำนวนเต็ม

array.sort(function(a,b){
    return a.updated_at.replace(/\D+/g,'')-b.updated_at.replace(/\D+/g,'');
});

หากวันที่สามารถจัดรูปแบบที่แตกต่างกันคุณอาจต้องเพิ่มบางอย่างสำหรับผู้ที่มีความต้องการ iso:

Date.fromISO: function(s){
    var day, tz,
    rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
    p= rx.exec(s) || [];
    if(p[1]){
        day= p[1].split(/\D/).map(function(itm){
            return parseInt(itm, 10) || 0;
        });
        day[1]-= 1;
        day= new Date(Date.UTC.apply(Date, day));
        if(!day.getDate()) return NaN;
        if(p[5]){
            tz= (parseInt(p[5], 10)*60);
            if(p[6]) tz+= parseInt(p[6], 10);
            if(p[4]== '+') tz*= -1;
            if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
        }
        return day;
    }
    return NaN;
}
if(!Array.prototype.map){
    Array.prototype.map= function(fun, scope){
        var T= this, L= T.length, A= Array(L), i= 0;
        if(typeof fun== 'function'){
            while(i< L){
                if(i in T){
                    A[i]= fun.call(scope, T[i], i, T);
                }
                ++i;
            }
            return A;
        }
    }
}
}

2
คุณใช้Date.parseไม่ได้เหรอ
Rocket Hazmat

1

เพื่อความสมบูรณ์นี่คือการใช้งานทั่วไปสั้น ๆ ของ sortBy:

function sortBy(list, keyFunc) {
  return list.sort((a,b) => keyFunc(a) - keyFunc(b));
}

sortBy([{"key": 2}, {"key": 1}], o => o["key"])

โปรดทราบว่าสิ่งนี้ใช้วิธีการเรียงลำดับอาร์เรย์ที่เรียงลำดับ สำหรับสำเนาคุณสามารถใช้ arr.concat () หรือ arr.slice (0) หรือวิธีที่คล้ายกันเพื่อสร้างสำเนา


1

ด้วยสิ่งนี้เราสามารถส่งผ่านฟังก์ชั่นคีย์เพื่อใช้สำหรับการเรียงลำดับ

Array.prototype.sortBy = function(key_func, reverse=false){
    return this.sort( (a, b) => {
        var keyA = key_func(a),
            keyB = key_func(b);
        if(keyA < keyB) return reverse? 1: -1;
        if(keyA > keyB) return reverse? -1: 1;
        return 0;
    }); 
}

ตัวอย่างเช่นถ้าเรามี

var arr = [ {date: "01/12/00", balls: {red: "a8",  blue: 10}},
            {date: "12/13/05", balls: {red: "d6" , blue: 11}},
            {date: "03/02/04", balls: {red: "c4" , blue: 15}} ]

เราทำได้

arr.sortBy(el => el.balls.red)
/* would result in
[ {date: "01/12/00", balls: {red: "a8", blue: 10}},
  {date: "03/02/04", balls: {red: "c4", blue: 15}},
  {date: "12/13/05", balls: {red: "d6", blue: 11}} ]
*/

หรือ

arr.sortBy(el => new Date(el.date), true)   // second argument to reverse it
/* would result in
[ {date: "12/13/05", balls: {red: "d6", blue:11}},
  {date: "03/02/04", balls: {red: "c4", blue:15}},
  {date: "01/12/00", balls: {red: "a8", blue:10}} ]
*/

หรือ

arr.sortBy(el => el.balls.blue + parseInt(el.balls.red[1]))
/* would result in
[ {date: "12/13/05", balls: {red: "d6", blue:11}},    // red + blue= 17
  {date: "01/12/00", balls: {red: "a8", blue:10}},    // red + blue= 18
  {date: "03/02/04", balls: {red: "c4", blue:15}} ]   // red + blue= 19
*/

1

คุณสามารถใช้ไลบรารียูทิลิตี้Lodashเพื่อแก้ปัญหานี้ (เป็นห้องสมุดที่ค่อนข้างมีประสิทธิภาพ):

const data = [{
    "updated_at": "2012-01-01T06:25:24Z",
    "foo": "bar"
  },
  {
    "updated_at": "2012-01-09T11:25:13Z",
    "foo": "bar"
  },
  {
    "updated_at": "2012-01-05T04:13:24Z",
    "foo": "bar"
  }
]

const ordered = _.orderBy(
  data,
  function(item) {
    return item.updated_at;
  }
);

console.log(ordered)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

คุณสามารถค้นหาเอกสารได้ที่นี่: https://lodash.com/docs/4.17.15#orderBy


0

คุณสามารถสร้างการปิดและส่งต่อให้แบบ ที่นี่เป็นตัวอย่างของฉันได้

$.get('https://data.seattle.gov/resource/3k2p-39jp.json?$limit=10&$where=within_circle(incident_location, 47.594972, -122.331518, 1609.34)', 
  function(responce) {

    var filter = 'event_clearance_group', //sort by key group name
    data = responce; 

    var compare = function (filter) {
        return function (a,b) {
            var a = a[filter],
                b = b[filter];

            if (a < b) {
                return -1;
            } else if (a > b) {
                return 1;
            } else {
                return 0;
            }
        };
    };

    filter = compare(filter); //set filter

    console.log(data.sort(filter));
});

0
var months = [
    {
        "updated_at" : "2012-01-01T06:25:24Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-09T11:25:13Z",
        "foo" : "bar"
    },
    {
        "updated_at" : "2012-01-05T04:13:24Z",
        "foo" : "bar"
    }];
months.sort((a, b)=>{
    var keyA = new Date(a.updated_at),
        keyB = new Date(b.updated_at);
    // Compare the 2 dates
    if(keyA < keyB) return -1;
    if(keyA > keyB) return 1;
    return 0;
});
console.log(months);

0
  • ใช้Array.sort()เพื่อจัดเรียงอาร์เรย์
  • อาร์เรย์โคลนโดยใช้ตัวดำเนินการสเปรด ( ) เพื่อทำให้ฟังก์ชันบริสุทธิ์
  • จัดเรียงตามคีย์ที่ต้องการ ( updated_at)
  • แปลงสตริงวันที่เป็นวัตถุวันที่
  • Array.sort() ทำงานโดยการลบคุณสมบัติสองอย่างจากรายการปัจจุบันและรายการถัดไปหากเป็นตัวเลข / วัตถุที่คุณสามารถดำเนินการตามจังหวะ
const input = [
  {
    updated_at: '2012-01-01T06:25:24Z',
    foo: 'bar',
  },
  {
    updated_at: '2012-01-09T11:25:13Z',
    foo: 'bar',
  },
  {
    updated_at: '2012-01-05T04:13:24Z',
    foo: 'bar',
  }
];

const sortByUpdatedAt = (items) => [...items].sort((itemA, itemB) => new Date(itemA.updated_at) - new Date(itemB.updated_at));

const output = sortByUpdatedAt(input);

console.log(input);
/*
[ { updated_at: '2012-01-01T06:25:24Z', foo: 'bar' }, 
  { updated_at: '2012-01-09T11:25:13Z', foo: 'bar' }, 
  { updated_at: '2012-01-05T04:13:24Z', foo: 'bar' } ]
*/
console.log(output)
/*
[ { updated_at: '2012-01-01T06:25:24Z', foo: 'bar' }, 
  { updated_at: '2012-01-05T04:13:24Z', foo: 'bar' }, 
  { updated_at: '2012-01-09T11:25:13Z', foo: 'bar' } ]
*/

0

ฉันเผชิญกับสิ่งเดียวกันดังนั้นฉันจัดการสิ่งนี้ด้วยสาเหตุทั่วไปและฉันสร้างฟังก์ชันสำหรับสิ่งนี้:

//example:
//array: [{name: 'idan', workerType: '3'}, {name: 'stas', workerType: '5'}, {name: 'kirill', workerType: '2'}]
//keyField: 'workerType'
// keysArray: ['4', '3', '2', '5', '6']
sortByArrayOfKeys = (array, keyField, keysArray) => {
    array.sort((a, b) => {
        const aIndex = keysArray.indexOf(a[keyField])
        const bIndex = keysArray.indexOf(b[keyField])
        if (aIndex < bIndex) return -1;
        if (aIndex > bIndex) return 1;
        return 0;
    })
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.