জাভাস্ক্রিপ্ট সি # লিনক এর সমতুল্য নির্বাচন করুন


136

এই প্রশ্ন অনুসরণ এখানে:

চেকবাক্সগুলির একটি তালিকা সহ নকআউটে চেক বাঁধাই ব্যবহার করে সমস্ত চেকবাক্স চেক করে

আমি নকআউট ব্যবহার করে কিছু চেকবাক্স তৈরি করেছি যা অ্যারে থেকে নির্বাচনের অনুমতি দেয়। উপরের পোস্ট থেকে নেওয়া ওয়ার্কিং ফিডল:

http://jsfiddle.net/NsCXJ/

কেবলমাত্র ফলের আইডির একটি অ্যারে তৈরি করার কোনও সহজ উপায় আছে?

আমি বাড়িতে সি তে # আরও থাকি যেখানে আমি লাইনের সাথে কিছু করতে চাই selectedFruits.select(fruit=>fruit.id);

জাভাস্ক্রিপ্ট / jquery এর সাথে অনুরূপ কিছু করার জন্য কি কোনও পদ্ধতি / রেডিমেড ফাংশন রয়েছে? অথবা সহজ বিকল্পটি তালিকাটির মধ্য দিয়ে লুপ করে দ্বিতীয় অ্যারে তৈরি করা হবে? আমি জেএসএন-তে সার্ভারে অ্যারেটি পোস্ট করার ইচ্ছা করি তাই প্রেরিত ডেটা হ্রাস করার চেষ্টা করছি।

উত্তর:


227

হ্যাঁ, অ্যারে.ম্যাপ () বা $। ম্যাপ () একই কাজ করে।

//array.map:
var ids = this.fruits.map(function(v){
    return v.Id;
});

//jQuery.map:
var ids2 = $.map(this.fruits, function (v){
    return v.Id;
});

console.log(ids, ids2);

http://jsfiddle.net/NsCXJ/1/

যেহেতু অ্যারে.ম্যাপটি পুরানো ব্রাউজারগুলিতে সমর্থিত নয়, তাই আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি jQuery পদ্ধতিতে আটকে থাকুন।

যদি আপনি কোনও কারণে অন্যটিকে পছন্দ করেন তবে আপনি সর্বদা পুরানো ব্রাউজার সমর্থনের জন্য একটি পলিফিল যোগ করতে পারেন।

আপনি অ্যারে প্রোটোটাইপে সর্বদা কাস্টম পদ্ধতিগুলি যুক্ত করতে পারেন:

Array.prototype.select = function(expr){
    var arr = this;
    //do custom stuff
    return arr.map(expr); //or $.map(expr);
};

var ids = this.fruits.select(function(v){
    return v.Id;
});

আপনি একটি স্ট্রিং পাস করলে ফাংশন কনস্ট্রাক্টর ব্যবহার করে এমন একটি বর্ধিত সংস্করণ। এর সাথে চারপাশে খেলার কিছু সম্ভবত:

Array.prototype.select = function(expr){
    var arr = this;

    switch(typeof expr){

        case 'function':
            return $.map(arr, expr);
            break;

        case 'string':

            try{

                var func = new Function(expr.split('.')[0], 
                                       'return ' + expr + ';');
                return $.map(arr, func);

            }catch(e){

                return null;
            }

            break;

        default:
            throw new ReferenceError('expr not defined or not supported');
            break;
    }

};

console.log(fruits.select('x.Id'));

http://jsfiddle.net/aL85j/

হালনাগাদ:

যেহেতু এটি একটি জনপ্রিয় উত্তর হয়ে গেছে, আমি আমার where()+ অনুরূপ যুক্ত করছি firstOrDefault()। এগুলি স্ট্রিং ভিত্তিক ফাংশন কনস্ট্রাক্টর পদ্ধতির সাথেও ব্যবহার করা যেতে পারে (যা সবচেয়ে দ্রুত) তবে এখানে ফিল্টার হিসাবে আক্ষরিক অর্থে অবজেক্ট ব্যবহার করার জন্য আরও একটি পদ্ধতি রয়েছে:

Array.prototype.where = function (filter) {

    var collection = this;

    switch(typeof filter) { 

        case 'function': 
            return $.grep(collection, filter); 

        case 'object':
            for(var property in filter) {
              if(!filter.hasOwnProperty(property)) 
                  continue; // ignore inherited properties

              collection = $.grep(collection, function (item) {
                  return item[property] === filter[property];
              });
            }
            return collection.slice(0); // copy the array 
                                      // (in case of empty object filter)

        default: 
            throw new TypeError('func must be either a' +
                'function or an object of properties and values to filter by'); 
    }
};


Array.prototype.firstOrDefault = function(func){
    return this.where(func)[0] || null;
};

ব্যবহার:

var persons = [{ name: 'foo', age: 1 }, { name: 'bar', age: 2 }];

// returns an array with one element:
var result1 = persons.where({ age: 1, name: 'foo' });

// returns the first matching item in the array, or null if no match
var result2 = persons.firstOrDefault({ age: 1, name: 'foo' }); 

ফাংশন কনস্ট্রাক্টর বনাম অবজেক্ট আক্ষরিক গতির তুলনা করার জন্য এখানে একটি জেএসপিফার পরীক্ষা দেওয়া হচ্ছে। আপনি যদি পূর্বটি ব্যবহার করার সিদ্ধান্ত নেন তবে স্ট্রিংগুলি সঠিকভাবে উদ্ধৃত করার বিষয়টি মনে রাখবেন।

আমার ব্যক্তিগত পছন্দটি হল 1-2 টি বৈশিষ্ট্য ফিল্টার করার সময় অবজেক্ট আক্ষরিক ভিত্তিক সমাধানগুলি ব্যবহার করা এবং আরও জটিল ফিল্টারিংয়ের জন্য একটি কলব্যাক ফাংশন পাস করা।

নেটিভ অবজেক্ট প্রোটোটাইপগুলিতে পদ্ধতি যুক্ত করার সময় আমি এটি 2 সাধারণ টিপসের সাহায্যে শেষ করব:

  1. ওভাররাইট করার আগে বিদ্যমান পদ্ধতিগুলির উপস্থিতি পরীক্ষা করুন যেমন:

    if(!Array.prototype.where) { Array.prototype.where = ...

  2. আপনার যদি IE8 এবং নীচে সমর্থন করার প্রয়োজন না হয় তবে অবজেক্ট.ডেফাইনপ্রোপার্টি ব্যবহারের পদ্ধতিগুলি তাদের অ-গণনাযোগ্য করে তুলুন । যদি for..inকোনও অ্যারে ব্যবহার করা হয় (যা প্রথম স্থানে ভুল) তবে তারা অসংখ্য গুণাবলীও পুনরাবৃত্তি করবে। শুধু একটি মাথা আপ.


1
@ ক্রিসনভিল আপনি আগ্রহী হলে আমি একটি স্ট্রিং সংস্করণ যুক্ত করেছি
জোহান

@ এমফ্লার্টস ভাল ধরা, আপডেট :)। আজকাল আমি এই ধরণের কাজের জন্য লোডাশ ব্যবহার করার পরামর্শ দেব। তারা উপরের কোডের মতো একই ইন্টারফেসটি প্রকাশ করে
জোহান

নকআউট পর্যবেক্ষণগুলি সমর্থন করার জন্য:return typeof item[property] === 'function' ? item[property]() === filter[property] : item[property] === filter[property];
লিনাস ক্যালডওয়েল

@ লিনাসক্যালডওয়েল আমি নকআউট ব্যবহার করার পরে অনেক দিন হয়ে গেছে, তবে এর মতো return ko.unwrap(item[property]) === filter[property]কী হবে?
জোহান

ঠিক আছে, আমি নকআউট উল্লেখ করেছি, তবে অবশ্যই এটি সমস্ত বৈশিষ্ট্যগুলি আবরণ করবে যা প্রয়োজনীয় পরামিতিগুলি ছাড়াই ফাংশন are তদ্ব্যতীত, কেন কেউ আপনার সুন্দর কোডের জেনেরিক স্টাইলটি ভাঙবে?
লিনাস

33

আমি জানি এটি দেরিতে উত্তর তবে এটি আমার পক্ষে কার্যকর ছিল! শুধু সম্পূর্ণ করার জন্য, $.grepফাংশনটি ব্যবহার করে আপনি লিনক অনুকরণ করতে পারেন where()

Linq:

var maleNames = people
.Where(p => p.Sex == "M")
.Select(p => p.Name)

javascript:

// replace where  with $.grep
//         select with $.map
var maleNames = $.grep(people, function (p) { return p.Sex == 'M'; })
            .map(function (p) { return p.Name; });

এটাই আমি চাই..কিন্তু আপনার উত্তর এবং গণনার মধ্যে আরও ভাল যা রয়েছে।
ভারত

15

যেহেতু আপনি নকআউট ব্যবহার করছেন, আপনার নকআউট ইউটিলিটি ফাংশনটি ব্যবহার করা arrayMap()এবং এটি অন্যান্য অ্যারে ইউটিলিটি ফাংশনগুলি বিবেচনা করা উচিত ।

এখানে অ্যারে ইউটিলিটি ফাংশন এবং তাদের সমতুল্য লিংক পদ্ধতিগুলির তালিকা রয়েছে:

arrayFilter() -> Where()
arrayFirst() -> First()
arrayForEach() -> (no direct equivalent)
arrayGetDistictValues() -> Distinct()
arrayIndexOf() -> IndexOf()
arrayMap() -> Select()
arrayPushAll() -> (no direct equivalent)
arrayRemoveItem() -> (no direct equivalent)
compareArrays() -> (no direct equivalent)

সুতরাং আপনি আপনার উদাহরণে যা করতে পারেন তা হ'ল:

var mapped = ko.utils.arrayMap(selectedFruits, function (fruit) {
    return fruit.id;
});

আপনি যদি জাভাস্ক্রিপ্টে ইন্টারফেসের মতো একটি লিনকিউ চান, আপনি লিনাক.জেএস এর মতো একটি লাইব্রেরি ব্যবহার করতে পারেন যা অনেকগুলি লিনকিউ পদ্ধতিতে একটি দুর্দান্ত ইন্টারফেস দেয়।

var mapped = Enumerable.From(selectedFruits)
    .Select("$.id") // 1 of 3 different ways to specify a selector function
    .ToArray();

14

ES6 উপায়:

let people = [{firstName:'Alice',lastName:'Cooper'},{firstName:'Bob',age:'Dylan'}];
let names = Array.from(people, p => p.firstName);
for (let name of names) {
  console.log(name);
}

এছাড়াও এ: https://jsfiddle.net/52dpucey/


অনেক প্রশংসিত. আমি কেবল ES6 এ যাচ্ছি যাতে এটি সুবিধাজনক হতে পারে!
ক্রিস নেভিল


4

আমি TsLinq.codeplex.com এর অধীনে টাইপস্ক্রিপ্টের জন্য একটি লিনক লাইব্রেরি তৈরি করেছি যা আপনি প্লেইন জাভাস্ক্রিপ্টের জন্যও ব্যবহার করতে পারেন। এই লাইব্রেরিটি লিনক.জেএসের চেয়ে ২-৩ গুণ দ্রুত এবং এতে সমস্ত লিঙ্ক পদ্ধতির ইউনিট পরীক্ষা রয়েছে। সম্ভবত আপনি এটি পর্যালোচনা করতে পারে।


2

একটি উঁকি নিতে underscore.js যা ফাংশন মত অনেক linq প্রদান করে। উদাহরণে আপনি যে মানচিত্রটি দিয়েছেন তা মানচিত্রের ফাংশনটি ব্যবহার করবে।


1
যদি কেউ জানতে চান যে তারা কীভাবে তুলনা করে আমি ব্লগ পোস্ট তৈরি করেছি যা ১৫ টিরও বেশি সর্বাধিক জনপ্রিয় লিনকুই / আন্ডারস্কোর.জেএস ফাংশনগুলির মধ্যে পার্থক্য ব্যাখ্যা করে: ভ্লাদোপ্যান্ডজিক
ভ্লাদো

1

আপনি manipulaপ্যাকেজ চেষ্টা করতে পারেন , যা সমস্ত সি # লিনিকিউ পদ্ধতি প্রয়োগ করে এবং এর বাক্য গঠনটি সংরক্ষণ করে: https://github.com/litichevskiydv/manipula

https://www.npmjs.com/package/manipula

আপনার উদাহরণ selectedFruits.select(fruit=>fruit.id); হিসাবে মনিপুলার সাথে প্রয়োগ করা হবে

Manipula.from(selectedFruits).select(fruit=>fruit.id);

0

ডিনকিজসের একটি লিনাকের মতো সিনট্যাক্স রয়েছে এবং মানচিত্র এবং সূচিপত্রের মতো ফাংশনগুলির জন্য পলিফিল সরবরাহ করে এবং জাভাস্ক্রিপ্টে অ্যারেগুলির সাথে কাজ করার জন্য বিশেষভাবে নকশা করা হয়েছে।


0

সাবলীল এক নজরে দেখুন , এটি লিনকিউ প্রায় সবই সমর্থন করে এবং পুনরাবৃত্তির উপর ভিত্তি করে - তাই এটি মানচিত্র, জেনারেটরের ফাংশন, অ্যারে, পুনরাবৃত্তযোগ্য সবকিছু দিয়ে কাজ করে।


0

সর্বাধিক অনুরূপ সি # Selectএনালগ একটি mapফাংশন হবে। শুধু ব্যবহার করুন:

var ids = selectedFruits.map(fruit => fruit.id);

selectedFruitsঅ্যারে থেকে সমস্ত আইডি নির্বাচন করতে ।

এটির জন্য কোনও বাহ্যিক নির্ভরতা প্রয়োজন নেই, কেবল খাঁটি জাভাস্ক্রিপ্ট। আপনি mapএখানে ডকুমেন্টেশনগুলি পেতে পারেন : https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অ্যারে / ম্যাপ


-1

মূল প্রশ্নের চেয়ে আমি প্রশ্নের শিরোনামের উত্তর দিচ্ছি যা আরও সুনির্দিষ্ট ছিল।

জাভা স্ক্রিপ্টের নতুন বৈশিষ্ট্যগুলির মতো পুনরাবৃত্তকারী এবং জেনারেটর ফাংশন এবং অবজেক্টের সাহায্যে জাভাস্ক্রিপ্টের জন্য লিনকিউ-এর মতো কিছু সম্ভব হয়েছে। নোট করুন যে উদাহরণস্বরূপ, লিংক.জেগুলি নিয়মিত প্রকাশের সাহায্যে সম্পূর্ণ ভিন্ন পদ্ধতির ব্যবহার করে সম্ভবত সেই সময়ে ভাষায় সহায়তার অভাবকে কাটিয়ে উঠতে পারে।

এই কথাটি বলা হচ্ছে যে, আমি জাভাস্ক্রিপ্টের জন্য একটি লিনকিউ লাইব্রেরি লিখেছি এবং আপনি এটি https://github.com/Siderite/LInQer এ খুঁজে পেতে পারেন । Https://siderite.dev/blog/linq-in-javascript-linqer এ মন্তব্য এবং আলোচনা ।

পূর্ববর্তী উত্তরগুলি থেকে, কেবল মণিপুলা জাভাস্ক্রিপ্টের একটি লিনকিউ বন্দর থেকে প্রত্যাশা করবে বলে মনে হচ্ছে।

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