it-swarm.dev

TypeScript فرز مجموعة

لقد كنت أحاول اكتشاف مشكلة غريبة للغاية واجهتها مع TypeScript. لقد كان يعامل تعبير Boolean مضمّن كما كان نوع القيمة الأولى بدلاً من التعبير الكامل.

لذلك إذا جربت شيئًا بسيطًا مثل ما يلي:

var numericArray:Array<number> = [2,3,4,1,5,8,11];

var sorrtedArray:Array<number> = numericArray.sort((n1,n2)=> n1 > n2);

جربها

سوف تحصل على خطأ في طريقة الفرز التي تقول إن المعلمات لا تتطابق مع أي توقيع لهدف الاستدعاء ، لأن نتيجتك رقمية وليست منطقية. أعتقد أنني أفتقد شيئًا ما على الرغم من أنني متأكد من أن n1> n2 عبارة منطقية.

95
Kent Cooper

الخطأ صحيح تماما.

لأنه يحاول أن يخبرك ، .sort() تأخذ دالة تُرجع الرقم ، وليس منطقية.

تحتاج إلى إرجاع سلبي إذا كان العنصر الأول أصغر ؛ إيجابية إذا كانت أكبر ، أو صفر إذا كانت متساوية.

123
SLaks

عند فرز الأرقام ، يمكنك استخدام المقارنة المدمجة:

var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];

var sortedArray: number[] = numericArray.sort((n1,n2) => n1 - n2);

على سبيل المثال - بدلاً من <.

إذا كنت تقارن أي شيء آخر ، فستحتاج إلى تحويل المقارنة إلى رقم.

var stringArray: string[] = ['AB', 'Z', 'A', 'AC'];

var sortedArray: string[] = stringArray.sort((n1,n2) => {
    if (n1 > n2) {
        return 1;
    }

    if (n1 < n2) {
        return -1;
    }

    return 0;
});
159
Fenton

جواب عظيم سوني. ترغب في إضافة أنه إذا كان لديك مجموعة من الكائنات وترغب في الفرز حسب المفتاح ، فسيكون هذا هو نفسه تقريبا ، وهذا مثال على أحدهما يمكن الترتيب حسب التاريخ (الرقم) أو العنوان (السلسلة):

    if (sortBy === 'date') {
        return n1.date - n2.date
    } else {
        if (n1.title > n2.title) {
           return 1;
        }
        if (n1.title < n2.title) {
            return -1;
        }
        return 0;
    }

يمكن أيضًا جعل القيم في الداخل كمتغيرات n1 [field] مقابل n2 [field] إذا كانت أكثر ديناميكية ، ما عليك سوى الاحتفاظ بالفرق بين السلاسل والأرقام.

19
yairniz
var numericArray: number[] = [2, 3, 4, 1, 5, 8, 11];

var sortFn = (n1 , n2) => number { return n1 - n2; }

var sortedArray: number[] = numericArray.sort(sortFn);
8
Yoav Schniederman

فرز المصفوفة المختلطة (الحروف الهجائية والأرقام)

function naturalCompare(a, b) {
   var ax = [], bx = [];

   a.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { ax.Push([$1 || Infinity, $2 || ""]) });
   b.replace(/(\d+)|(\D+)/g, function (_, $1, $2) { bx.Push([$1 || Infinity, $2 || ""]) });

   while (ax.length && bx.length) {
     var an = ax.shift();
     var bn = bx.shift();
     var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
     if (nn) return nn;
   }

   return ax.length - bx.length;
}

let builds = [ 
    { id: 1, name: 'Build 91'}, 
    { id: 2, name: 'Build 32' }, 
    { id: 3, name: 'Build 13' }, 
    { id: 4, name: 'Build 24' },
    { id: 5, name: 'Build 5' },
    { id: 6, name: 'Build 56' }
]

let sortedBuilds = builds.sort((n1, n2) => {
  return naturalCompare(n1.name, n2.name)
})

console.log('Sorted by name property')
console.log(sortedBuilds)
6
WasiF

يبدو أن أسهل طريقة هي طرح الرقم الثاني من الأول:

var numericArray:Array<number> = [2,3,4,1,5,8,11];

var sorrtedArray:Array<number> = numericArray.sort((n1,n2) => n1 - n2);

https://alligator.io/js/array-sort-numbers/

6
Rafael Fraga Walter