एक परिसीमन के साथ तार को मिलाएं केवल अगर तार अशक्त या खाली नहीं हैं


118

ऐसा लगता है कि यह सरल होना चाहिए, इसलिए क्षमा करें यदि मैं यहां कुछ याद कर रहा हूं, लेकिन मैं केवल गैर-अशक्त या गैर-रिक्त तारों को संक्षिप्त करने का एक सरल तरीका खोजने की कोशिश कर रहा हूं।

मेरे पास कई विशिष्ट पते फ़ील्ड हैं:

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

इनके लिए मान पृष्ठ में कुछ फ़ॉर्म फ़ील्ड और कुछ अन्य js कोड के आधार पर सेट हो जाते हैं।

मैं पूरा पता आउटपुट में करना चाहता हूँ 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

@ एगा का समाधान बहुत अच्छा है, लेकिन यह उनके जावास्क्रिप्ट इंजनों में Array.prototype.filter () की कमी के कारण IE8 जैसे पुराने ब्राउज़रों में काम नहीं करता है ।

उन लोगों के लिए जो एक विस्तृत श्रेणी के ब्राउज़रों में काम करने वाले कुशल समाधान में रुचि रखते हैं (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);
};

इसमें एमडीएन पर वर्णित कुछ प्रदर्शन अनुकूलन शामिल हैं

और यहाँ एक उपयोग उदाहरण है:

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


0
$.each([address,city,state,zip], 
    function(i,v) { 
        if(v){
             var s = (i>0 ? ", ":"") + v;
             $("#addressDiv").append(s);
        } 
    }
);`
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.