मेरे पास वस्तुओं की एक सरणी है और मैं इसे तिथि के अनुसार क्रमबद्ध करना चाहता हूं (इस मामले में यह संपत्ति है occurredAt इसके नाम पर)। यहाँ सरणी है:

const arr = [
  {
    EmailCampaignEvents.campaignRef: "test6example1",
    EmailCampaignEvents.campaignSentAt: "2021-04-09T13:19:24.000",
    EmailCampaignEvents.customerRef: "Customer/activityTest10",
    EmailCampaignEvents.emailRef: "Email/9374eaee0713f36a247b0d0c863e920b",
    EmailCampaignEvents.eventType: "delivery",
    EmailCampaignEvents.occurredAt: "2021-04-09T13:19:25.000",
  },
  {
    Events.occurredAt: "2017-01-11T17:29:57.000",
    Events.productRef: "Event/201-13",
    Events.relatedEntityRefFlat: "Customer/201-5645307",
    Events.transactionCurrency: "SEK",
    Events.transactionItemCount: "4",
    Events.transactionItemPrice: "235.85",
    Events.type: "as.commerce.transaction.completed",
    relatedEventName: "Hammarby-Östersunds FK",
  },
  {
    Events.occurredAt: "2018-01-11T17:29:57.000",
    Events.productRef: "Event/201-13",
    Events.relatedEntityRefFlat: "Customer/201-5645307",
    Events.transactionCurrency: "SEK",
    Events.transactionItemCount: "2",
    Events.transactionItemPrice: "135.85",
    Events.type: "as.commerce.transaction.completed",
    relatedEventName: "Hammarby-Östersunds FK",
  },
];

ध्यान दें कि पहली वस्तु में मेरे पास EmailCampaignEvents.occurredAt है और बाकी दो में मेरे पास इस तरह की संपत्ति है Events.occurredAt। क्या इस सरणी को किसी तरह सॉर्ट करना संभव है? किसी भी उदाहरण की सराहना की जाएगी!

1
Milos 21 अप्रैल 2021, 15:00

3 जवाब

सबसे बढ़िया उत्तर

यदि वास्तव में केवल 2 संभावनाएं हैं, तो आप केवल बूलियन का उपयोग कर सकते हैं या पहली से दूसरी संभावना तक फ़ॉलबैक कर सकते हैं:

const arr = [
  {
    "EmailCampaignEvents.campaignRef": "test6example1",
    "EmailCampaignEvents.campaignSentAt": "2021-04-09T13:19:24.000",
    "EmailCampaignEvents.customerRef": "Customer/activityTest10",
    "EmailCampaignEvents.emailRef": "Email/9374eaee0713f36a247b0d0c863e920b",
    "EmailCampaignEvents.eventType": "delivery",
    "EmailCampaignEvents.occurredAt": "2021-04-09T13:19:25.000",
  },
  {
    "Events.occurredAt": "2017-01-11T17:29:57.000",
    "Events.productRef": "Event/201-13",
    "Events.relatedEntityRefFlat": "Customer/201-5645307",
    "Events.transactionCurrency": "SEK",
    "Events.transactionItemCount": "4",
    "Events.transactionItemPrice": "235.85",
    "Events.type": "as.commerce.transaction.completed",
    "relatedEventName": "Hammarby-Östersunds FK",
  },
  {
    "Events.occurredAt": "2018-01-11T17:29:57.000",
    "Events.productRef": "Event/201-13",
    "Events.relatedEntityRefFlat": "Customer/201-5645307",
    "Events.transactionCurrency": "SEK",
    "Events.transactionItemCount": "2",
    "Events.transactionItemPrice": "135.85",
    "Events.type": "as.commerce.transaction.completed",
    "relatedEventName": "Hammarby-Östersunds FK",
  },
];

const result = arr.sort((a,b) => {
  const aVal = new Date(a["EmailCampaignEvents.occurredAt"] || a["Events.occurredAt"]);
  const bVal = new Date(b["EmailCampaignEvents.occurredAt"] || b["Events.occurredAt"]);
  return aVal - bVal;
});

console.log(result);
1
Jamiec 21 अप्रैल 2021, 15:34

समस्या की जड़ वस्तुओं के परिवर्तनीय कुंजी नाम हैं जो occurredAt दिनांक मानों को संग्रहीत करते हैं, आप substring प्रत्येक ऑब्जेक्ट की कुंजियों में।

const getOccurredAt = (obj) => {
  const key = Object.keys(obj).filter(k => k.includes('occurredAt'))[0];
  if (key) {
    return obj[key];
  }
  return null; // Set a default based on your use-case
}

arr.sort((x, y) => {
  const xVal = getOccurredAt(x);
  const yVal = getOccurredAt(y);
  return new Date(yVal) - new Date(xVal);
})

यह आपकी समस्या का समाधान करेगा, लेकिन यदि संभव हो तो मैं निश्चित रूप से सभी वस्तुओं में समान डेटा के लिए लगातार कुंजी नाम रखने की अनुशंसा करता हूं।

2
Sahil Lamba 21 अप्रैल 2021, 15:38

Array.prototype.sort() का इस्तेमाल करें एक कस्टम सॉर्ट फ़ंक्शन के साथ। आप Object.keys() .occurredAt में समाप्त होने वाली ऑब्जेक्ट कुंजियों को खोजने के लिए। इस तरह:

const arr = [
  {
    "EmailCampaignEvents.campaignRef": "test6example1",
    "EmailCampaignEvents.campaignSentAt": "2021-04-09T13:19:24.000",
    "EmailCampaignEvents.customerRef": "Customer/activityTest10",
    "EmailCampaignEvents.emailRef": "Email/9374eaee0713f36a247b0d0c863e920b",
    "EmailCampaignEvents.eventType": "delivery",
    "EmailCampaignEvents.occurredAt": "2021-04-09T13:19:25.000",
  },
  {
    "Events.occurredAt": "2017-01-11T17:29:57.000",
    "Events.productRef": "Event/201-13",
    "Events.relatedEntityRefFlat": "Customer/201-5645307",
    "Events.transactionCurrency": "SEK",
    "Events.transactionItemCount": "4",
    "Events.transactionItemPrice": "235.85",
    "Events.type": "as.commerce.transaction.completed",
    relatedEventName: "Hammarby-Östersunds FK",
  },
  {
    "Events.occurredAt": "2018-01-11T17:29:57.000",
    "Events.productRef": "Event/201-13",
    "Events.relatedEntityRefFlat": "Customer/201-5645307",
    "Events.transactionCurrency": "SEK",
    "Events.transactionItemCount": "2",
    "Events.transactionItemPrice": "135.85",
    "Events.type": "as.commerce.transaction.completed",
    relatedEventName: "Hammarby-Östersunds FK",
  },
]

arr.sort((a, b) => {
  const keyA = Object.keys(a).find((key) => key.endsWith('.occurredAt'))
  const keyB = Object.keys(b).find((key) => key.endsWith('.occurredAt'))
  const dateA = new Date(a[keyA])
  const dateB = new Date(b[keyB])
  return dateA - dateB // oldest to newest
})

console.log(arr)

ध्यान दें कि Array.prototype.sort() मूल सरणी को संशोधित करता है। आप उपयोग कर सकते हैं उदा। arr.slice().sort() पहले ऐरे की एक कॉपी बनाने के लिए और फिर कॉपी किए गए ऐरे को सॉर्ट करने के लिए।

1
Matias Kinnunen 21 अप्रैल 2021, 15:34