টাইপস্ক্রিপ্ট একটি অ্যারে বাছাই


154

আমি টাইপস্ক্রিপ্ট দিয়ে দৌড়ে একটি খুব অদ্ভুত সমস্যাটি বের করার চেষ্টা করছি been এটি একটি ইনলাইন বুলিয়ান এক্সপ্রেশন হিসাবে চিকিত্সা করছিল কারণ প্রথম প্রকাশের ধরণটি সম্পূর্ণ এক্সপ্রেশনের পরিবর্তে যাই হোক না কেন।

সুতরাং আপনি যদি নীচের মতো সাধারণ কিছু চেষ্টা করেন:

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

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

TryIt

পরামিতিগুলি কল টার্গেটের কোনও স্বাক্ষরের সাথে মেলে না বলে আপনি আপনার সাজানোর পদ্ধতিতে একটি ত্রুটি পেয়ে যাবেন, কারণ আপনার ফলাফলটি বুলিয়ান নয়, তবে এটির সংখ্যাটি সাংখ্যিক। আমি অনুমান করি যদিও আমি কিছু মিস করছি কারণ আমি নিশ্চিত যে এন 1> এন 2 একটি বুলিয়ান বিবৃতি।

উত্তর:


180

ত্রুটিটি সম্পূর্ণ সঠিক।

এটি আপনাকে বলার চেষ্টা করার পরে, .sort()এমন একটি ফাংশন নেয় যা বুলিয়ান নয়, সংখ্যাটি দেয়।

প্রথম আইটেমটি ছোট হলে আপনাকে নেতিবাচক ফিরিয়ে আনতে হবে; এটি যদি বৃহত্তর হয় তবে ইতিবাচক, বা তারা সমান হলে শূন্য।


56
এজন্য আমরা টাইপস্ক্রিপ্ট ব্যবহার করি! :-)
— স্টিফেন চুং

226

নাম্বার

সংখ্যা বাছাই করার সময়, আপনি কমপ্যাক্ট তুলনাটি ব্যবহার করতে পারেন:

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;
});

অবজেক্টস

অবজেক্টগুলির জন্য, আপনি কোনও সম্পত্তির উপর ভিত্তি করে বাছাই করতে পারেন, সংক্ষিপ্ত হাতের সংখ্যার ধরণের ক্ষেত্রে সক্ষম হওয়ার বিষয়ে উপরের তথ্যটি মনে রাখবেন। নীচের উদাহরণটি প্রকার নির্বিশেষে কাজ করে।

var objectArray: { age: number; }[] = [{ age: 10}, { age: 1 }, {age: 5}];

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

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

    return 0;
});

কেউ কি ব্যাখ্যা করতে পারে যে, কম-বেশি পরীক্ষার জন্য, 'রায়@my.net' 'bob@my.net' এর চেয়ে কম কেন সত্য দেয়? উদাহরণস্বরূপ: যাক myTest = ('Roy@my.net' <'bob@my.net'); // আমার জন্য সত্য ফিরে আসে ... :(
— ওয়ালেস হাওয়ারি

1
দ্বিতীয় ক্ষেত্রে আপনি বর্তমান লোকেলের স্ট্রিংগুলির সাথে তুলনা করতে লোকালক্যাম্পার () ব্যবহার করতে পারেন, যা একটি নম্বর দেয়
— নিউরাল 5 টির্ম

দয়া করে আমাকে ব্যাখ্যা করুন, (n1,n2)=>n1-n2এক্সপ্রেশন কীভাবে কার্যকর হবে বা কাজ করবে .. ??
— রাহুল চৌধারী

1
সংখ্যাটির উদাহরণে রাহুলচৌধারি, এটি এমন একটি ফাংশন যা সংখ্যাগুলি গ্রহণ করে n1এবং n2ফাংশনটির মধ্যে এটি ফিরে আসে n1-n2, যা হয় ধনাত্মক সংখ্যা, শূন্য বা নেতিবাচক সংখ্যা হবে। এটি সাজানোর ক্রিয়াকলাপকে বলে যে আইটেমগুলি পরিবর্তন করা উচিত বা না করা উচিত, এইভাবে বাছাইকরণ সক্ষম করে।
— ফেন্টন

এটি বিভিন্ন স্বত্বের সাথে ফিল্টার হতে পারে
— অরবিন্দ

24

দুর্দান্ত উত্তর সোহনি। এটি যুক্ত করতে চান যে আপনার যদি অবজেক্টগুলির একটি অ্যারে থাকে এবং আপনি কী অনুসারে বাছাই করতে চান তবে এটি প্রায় একই, এটি একটি উদাহরণ যা উভয় তারিখ (সংখ্যা) বা শিরোনাম (স্ট্রিং) অনুসারে বাছাই করতে পারে:

    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;
    }

ভ্যারিয়েবল এন 1 [ক্ষেত্র] বনাম এন 2 [ক্ষেত্র] হিসাবে মানগুলি ভিতরে তৈরি করতে পারে যদি এর আরও গতিশীল হয়, কেবল স্ট্রিং এবং সংখ্যার মধ্যে পার্থক্য রাখুন keep


উত্তরের উপর মন্তব্যগুলি মন্তব্য ফাংশনটি ব্যবহার করে করা উচিত।
— নিকটার

6
@ নিকটার এটি ফর্ম্যাট করার উত্তর হিসাবে সম্ভবত পোস্ট করা হয়েছে। তবে এটি কোনও ক্ষতি করে না
— ওয়াউটার ভ্যানহের্ক

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

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

const sortedArray: number[] = numericArray.sort(sortFn);

কিছু ক্ষেত্র অনুসারে বাছাই করুন:

let arr:{key:number}[] = [{key : 2}, {key : 3}, {key : 4}, {key : 1}, {key : 5}, {key : 8}, {key : 11}];

let sortFn2 = (obj1 , obj2) => {key:number} { return obj1.key - obj2.key; }

const sortedArray2:{key:number}[] = arr.sort(sortFn2);

1
এন 1 - এন 2 নেতিবাচক যখন এন 1 <এন 2, ইতিবাচক যখন এন 1> এন 2 এবং 0 যখন এন 1 == এন 2
— সাবেস্টিয়েন স্টর্মাক্যাক

2
ধন্যবাদ! আমি এটির জন্য এটি পরিবর্তন করেছি: myArray.sort ((a, b): সংখ্যা => {a.NumberProp - b.NumberProp;});
— ল্রড্রিগেজ 84

10

মিশ্রিত অ্যারে বাছাই করুন (বর্ণমালা এবং সংখ্যা)

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)


আপনাকে অনেক ধন্যবাদ :)
— স্টিভ


0

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)


হ্যালো, Stackoverflow স্বাগতম stackoverflow.com/help/how-to-answer দয়া করে এই ডকুমেন্টেশন পড়া এবং কিছু বিবরণ কি করা উচিত প্রদান।
— প্রাকটিক দার্জি

0

_.sortByটাইপস্ক্রিপ্টে পুনরায় তৈরি করার চেষ্টা করার সময় আমি আজ এটি লিখেছিলাম এবং ভেবেছিলাম যে এটি প্রয়োজনের জন্য রেখে দেব।

// ** Credits for getKeyValue at the bottom **
export const getKeyValue = <T extends {}, U extends keyof T>(key: U) => (obj: T) => obj[key] 

export const sortBy = <T extends {}>(index: string, list: T[]): T[] => {
    return list.sort((a, b): number => {
        const _a = getKeyValue<keyof T, T>(index)(a)
        const _b = getKeyValue<keyof T, T>(index)(b)
        if (_a < _b) return -1
        if (_a > _b) return 1
        return 0
    })
}

ব্যবহার:

এটি জেনেরিক টাইপ টির একটি অ্যারের প্রত্যাশা করে, সুতরাং এর জন্য অভিনেতার <T extends {}>পাশাপাশি প্যারামিটার এবং ফাংশন রিটার্ন টাইপ টাইপ করেT[]

const x = [{ label: 'anything' }, { label: 'goes'}]
const sorted = sortBy('label', x)

** getByKeyfn এখানে পাওয়া যায়

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.