স্ট্রিংগুলি নাল বা ফাঁকা না থাকলে কেবল একটি ডিলিমিটারের সাথে স্ট্রিংগুলিতে যোগদান করুন


118

এটি সাধারণ হওয়া উচিত বলে মনে হয়, তাই আমি যদি এখানে কিছু মিস করছি তবে দুঃখিত, তবে আমি কেবল নন-নাল বা খালি খালি স্ট্রিংগুলি যুক্ত করার জন্য একটি সহজ উপায় সন্ধান করার চেষ্টা করছি।

আমার বেশ কয়েকটি স্বতন্ত্র ঠিকানা ক্ষেত্র রয়েছে:

var address;
var city;
var state;
var zip;

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

divকমা + স্পেস দ্বারা সীমাবদ্ধ, আমি সম্পূর্ণ ঠিকানা আউটপুট করতে চাই, তাই এরকম কিছু:

$("#addressDiv").append(address + ", " + city + ", " + state + ", " + zip);

সমস্যাটি হচ্ছে, এই ক্ষেত্রগুলির একটি বা সমস্ত শূন্য / ফাঁকা হতে পারে।

স্ট্রিংটিতে যোগ করার আগে পৃথকভাবে প্রতিটিটির দৈর্ঘ্য পরীক্ষা না করে খালি এই খালি খালি ক্ষেত্রের সমস্তগুলিতে যোগ দেওয়ার কোনও সহজ উপায় আছে কি?


কেন কোনও বস্তুর সমস্ত ক্ষেত্রগুলি লুপ, তুলনা, বাতিল করা হয় না?
এলক্ল্যানাররা

উত্তর:


218

বিবেচনা

var address = "foo";
var city;
var state = "bar";
var zip;

text = [address, city, state, zip].filter(Boolean).join(", ");
console.log(text)

.filter(Boolean)(যা এর সমান .filter(x => x)) সমস্ত "মিথ্যা" মানগুলি (নালস, অপরিবর্তিত খালি স্ট্রিং ইত্যাদি) সরিয়ে দেয়। যদি আপনার "খালি" সংজ্ঞাটি আলাদা হয়, তবে আপনাকে এটি সরবরাহ করতে হবে, উদাহরণস্বরূপ:

 [...].filter(x => typeof x === 'string' && x.length > 0)

তালিকায় কেবল খালি খালি স্ট্রিং রাখবে।

-

(অপ্রচলিত jquery উত্তর)

var address = "foo";
var city;
var state = "bar";
var zip;

text = $.grep([address, city, state, zip], Boolean).join(", "); // foo, bar

117

তবুও অন্য এক-লাইন সমাধান, যার প্রয়োজন নেই jQuery:

var address = "foo";
var city;
var state = "bar";
var zip;

text = [address, city, state, zip].filter(function (val) {return val;}).join(', ');

40
এটি সম্ভবত সেরা উত্তর। নেটিভ ফাংশন ব্যবহার করে। আপনি যদি es6 / es2015 ব্যবহার করছেন তবে এটি কেবল সংক্ষিপ্ত করা যেতে পারে [address, city, state, zip].filter(val => val).join(', ')
স্যার.নাথন স্টাসসেন



5

@ আগার সমাধানটি দুর্দান্ত, তবে জাভা স্ক্রিপ্ট ইঞ্জিনগুলিতে অ্যারে.প্রোটোটাইপ.ফিল্টার () এর অভাবের কারণে এটি আইই 8 এর মতো পুরানো ব্রাউজারগুলিতে কাজ করে না ।

যারা ব্রাউজারের বিস্তৃত পরিসরে (IE 5.5 - 8 সহ) এবং যার জন্য jQuery প্রয়োজন হয় না তাদের দক্ষ সমাধানে আগ্রহী তাদের জন্য নীচে দেখুন:

var join = function (separator /*, strings */) {
    // Do not use:
    //      var args = Array.prototype.slice.call(arguments, 1);
    // since it prevents optimizations in JavaScript engines (V8 for example).
    // (See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments)
    // So we construct a new array by iterating through the arguments object
    var argsLength = arguments.length,
        strings = [];

    // Iterate through the arguments object skipping separator arg
    for (var i = 1, j = 0; i < argsLength; ++i) {
        var arg = arguments[i];

        // Filter undefineds, nulls, empty strings, 0s
        if (arg) {
            strings[j++] = arg;
        }
    }

    return strings.join(separator);
};

এটা তোলে MDN বর্ণিত কয়েকটি কার্যকারিতা অপ্টিমাইজেশন অন্তর্ভুক্ত এখানে

এবং এখানে একটি ব্যবহার উদাহরণ:

var fullAddress = join(', ', address, city, state, zip);

1

চেষ্টা

function joinIfPresent(){
    return $.map(arguments, function(val){
        return val && val.length > 0 ? val : undefined;
    }).join(', ')
}
$("#addressDiv").append(joinIfPresent(address, city, state, zip));

ডেমো: ফিডল


0
$.each([address,city,state,zip], 
    function(i,v) { 
        if(v){
             var s = (i>0 ? ", ":"") + v;
             $("#addressDiv").append(s);
        } 
    }
);`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.