লড্যাশ ব্যবহার করে কোনও অবজেক্ট থেকে অপরিজ্ঞাত এবং নাল মানগুলি কীভাবে সরিয়ে নেওয়া যায়?


172

আমার কাছে জাভাস্ক্রিপ্ট অবজেক্ট যেমন:

var my_object = { a:undefined, b:2, c:4, d:undefined };

কীভাবে সমস্ত অপরিশোধিত সম্পত্তি মুছে ফেলা যায়? মিথ্যা গুণাবলী থাকা উচিত।

উত্তর:


195

আপনি যদি সমস্ত মিথ্যা মানগুলি মুছে ফেলতে চান তবে সর্বাধিক কমপ্যাক্ট উপায় হ'ল:

জন্য Lodash 4.x এবং পরে :

_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}

জন্য উত্তরাধিকার Lodash 3.x:

_.pick(obj, _.identity);

_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}

63
দয়া করে মনে রাখবেন যে লোটাস 4 এ এটি হওয়া উচিত_.pickBy(obj, _.identity);
টম স্পেন্সার

30
প্লেস নোট এই পদ্ধতিটি মিথ্যা মানও সরিয়ে ফেলবে।
সীমাহীন

12
সতর্কতা অবলম্বন করুন, এটি মূল্যবান falseসমেত বুলিয়ান সম্পত্তি মুছে ফেলবে
সায় রাম

6
মিথ্যা অপসারণের পাশাপাশি এটি 0 এবং '' এর সাথে মানগুলিও মুছে ফেলবে ... একটি ভাল ধারণা নয়।
ফেদেরিকো বুদাসি

4
এই উত্তরটি সংশোধনযোগ্য নয় কারণ এটি মিথ্যা মানগুলিও সরিয়ে দেয়। আমার উত্তর নীচে পরীক্ষা করুন।
টিয়াগো বের্তোলো

224

আপনি কেবল শৃঙ্খলা তৈরি _.omit()করতে _.isUndefinedএবং _.isNullরচনাগুলি তৈরি করতে পারেন এবং অলস মূল্যায়নের সাথে ফলাফল পেতে পারেন।

ডেমো

var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();

14 মার্চ, 2016 আপডেট করুন :

মন্তব্য বিভাগে ডিল্যান্ট দ্বারা উল্লিখিত হিসাবে , আপনার _.omitBy()ফাংশনটি ব্যবহার করা উচিত কারণ এটি কোনও সম্পত্তির পরিবর্তে একটি শিকারী ব্যবহার করে । আপনার এটি লোড্যাশ সংস্করণ 4.0.0এবং উপরের জন্য ব্যবহার করা উচিত ।

ডেমো

var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();

জুন 1, 2016 আপডেট করুন :

ম্যাক্স ট্রুক্সার মন্তব্য অনুসারে , লোডাশ ইতিমধ্যে একটি বিকল্প সরবরাহ করেছে _.isNil, যা উভয়ের জন্য পরীক্ষা করে nullএবং undefined:

var result = _.omitBy(my_object, _.isNil);

7
যেগুলি লড্যাশের আরও সাম্প্রতিক সংস্করণ ব্যবহার করছে তাদের উচিত omitByফাংশনটি পরিবর্তে ব্যবহার করা উচিত omit। সুতরাং_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
ডিল্যান্টস

31
Lodash 4.0.0 যেহেতু আপনি ব্যবহার করতে পারেন _.isNilপরিবর্তে chaining এর _.isUndefinedএবং _.isNull। এটি এটিকে আরও খাটো করে তোলে:var result = _.omitBy(my_object, _.isNil);
ম্যাক্স ট্রুক্সা

@ ম্যাক্সট্রাক্সা পুনরাবৃত্তভাবে "নীল" মানগুলি পরীক্ষা করার জন্য আপনি কীভাবে এটিকে পরিবর্তন করবেন?
এজেড করা হয়েছে

1
লোডাশ এর omitByচেয়ে কম পারফরম্যান্ট pickBy, সুতরাং পরবর্তীটি পছন্দ করা উচিত এবং পুনরাবৃত্ত ফাংশনের শর্তটি বিপরীত। উপরে গৃহীত উত্তরটি সে অধিকার পেয়েছে।
আর্নেস্তো

1
ওপির প্রশ্নটি কেবল নির্দিষ্ট nullএবং undefinedমানগুলি উল্লেখ করে । identityসম্পৃক্ত এছাড়াও সরাবে falseমান, তাই আপনি যদি কেবল প্রশ্ন আমার উত্তর নিয়ে একটি সমস্যা অভিপ্রায় তারপর আমি দেখতে পাচ্ছি না উপরে এটা ভিত্তি করে। অতিরিক্তভাবে, আমরা যদি "পারফরম্যান্স" সম্পর্কে টক্কর দিই, omitByকেবল pickByএকটি অবহেলিত identityপ্রিকিকেটের সাথে ডিফল্টরূপে কল করি। সুতরাং, পারফরম্যান্সের দিক থেকে এটি উল্লেখযোগ্য হতে খুব ছোট।
রাইবালার

38

আপনি যদি লড্যাশ ব্যবহার করছেন তবে আপনি _.compact(array)অ্যারে থেকে সমস্ত মিথ্যা মান সরিয়ে ফেলতে পারেন ।

_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]

https://lodash.com/docs/4.17.4#compact


36
কমপ্যাক্ট অ্যারেগুলিতে প্রযোজ্য কিন্তু প্রশ্নটি বস্তুগুলি সম্পর্কে
গাইডোম্যান

1
আমি 0 রাখতে চাই না বাদে আরগ, এত কাছে।
সামি

2
@ সাম্মি, আপনি সেক্ষেত্রে ব্যবহার করতে পারেন _.pickBy(object, _.isNumber)
জন রিক্স

1
আপনাকে ধন্যবাদ হেরিক ওই কাজগুলো. আমি এখন ঘুমাতে যাব.
টেকনোফাইল

1
@ টেকনোফাইল, আমি আপনার সাথে একমত (এবং আমিই এই উত্তরটি লিখেছি, হ্যাঁ)। তবে আমি এই উত্তরটি এখানে রাখছি কারণ এটি খুব কম সময়েই কিছু মানুষের সমস্যা সমাধান করে ।
জাভাফিশ 14

25

সঠিক উত্তরটি হ'ল:

_.omitBy({ a: null, b: 1, c: undefined, d: false }, _.isNil)

ফলাফলগুলি:

{b: 1, d: false}

অন্যান্য ব্যক্তিদের দ্বারা এখানে দেওয়া বিকল্প:

_.pickBy({ a: null, b: 1, c: undefined, d: false }, _.identity);

falseএখানে মানগুলি পছন্দ করে না এমন মানগুলিও সরিয়ে ফেলবে ।


{"a":1,"b":{"a":1,"b":null,"c":undefined}}, অবজেক্ট.বি সম্পত্তি b, 'সি' সরানো হবে না
mqliutie

@ এমকিলিটি প্রত্যাশিত হিসাবে
টিয়াগো বের্তলো

18

শুধু:

_.omit(my_object, _.isUndefined)

nullউপরেরগুলি অ্যাকাউন্টের মান গ্রহণ করে না , কারণ এগুলি মূল উদাহরণ থেকে অনুপস্থিত এবং কেবলমাত্র বিষয়টিতে উল্লিখিত হয়েছে, তবে আমি এটি এটিকে মার্জিত হিসাবে এবং এটির ব্যবহারগুলি থাকতে পারে বলে রেখে দিয়েছি।

এখানে সম্পূর্ণ উদাহরণ, কম সংক্ষিপ্ত, তবে আরও সম্পূর্ণ।

var obj = { a: undefined, b: 2, c: 4, d: undefined, e: null, f: false, g: '', h: 0 };
console.log(_.omit(obj, function(v) { return _.isUndefined(v) || _.isNull(v); }));

8
নোট করুন যে এটি লোডাশ v.3 এর জন্য। V.4 এর জন্য আপনাকে ব্যবহার করতে হবে _.omitBy
ফিলিহো

16

অন্যান্য উত্তরগুলি সম্পূর্ণ করার জন্য, লোডাস 4 এ কেবল অপরিজ্ঞাত এবং নাল উপেক্ষা করার জন্য (এবং এর মতো বৈশিষ্ট্য নয় false) আপনি একটি প্রিকিকেট ব্যবহার করতে পারেন _.pickBy:

_.pickBy(obj, v !== null && v !== undefined)

নীচে উদাহরণ:

const obj = { a: undefined, b: 123, c: true, d: false, e: null};

const filteredObject = _.pickBy(obj, v => v !== null && v !== undefined);

console.log = (obj) => document.write(JSON.stringify(filteredObject, null, 2));
console.log(filteredObject);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>


1
এই সবচেয়ে ভালো সমাধান যদি আপনি সরাতে না চান 0, '', falseমান। এছাড়াও আপনি কলব্যাকটি সংক্ষিপ্ত করতে পারেন v => v != null
সরলজেজে

2
সহজ সমাধান। এই জন্য আপনাকে ধন্যবাদ.
অর্জুন জি পেরামব্রা

10

লোডাশ ডক্স অনুসারে:

_.compact(_.map(array, fn))

এছাড়াও আপনি সমস্ত নাল ফিল্টার করতে পারেন


6

গভীর নেস্টেড অবজেক্টের জন্য আপনি লড্যাশ> 4 এর জন্য আমার স্নিপেট ব্যবহার করতে পারেন

const removeObjectsWithNull = (obj) => {
    return _(obj)
      .pickBy(_.isObject) // get only objects
      .mapValues(removeObjectsWithNull) // call only for values as objects
      .assign(_.omitBy(obj, _.isObject)) // save back result that is not object
      .omitBy(_.isNil) // remove null and undefined from object
      .value(); // get value
};

5

আমি undefinedকোনও অবজেক্ট (গভীরভাবে) থেকে সরিয়ে নিয়ে একইরকম সমস্যার মুখোমুখি হয়েছি এবং দেখেছি যে আপনি যদি আপনার সরল পুরাতন অবজেক্টটি রূপান্তর করতে এবং জেএসওএন ব্যবহার করতে ঠিক থাকেন তবে দ্রুত এবং নোংরা সহায়ক ফাংশনটি দেখতে এরকম হবে:

function stripUndefined(obj) {
  return JSON.parse(JSON.stringify(obj));
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Description

"... যদি পূর্বনির্ধারিত হয়, রূপান্তরকালে কোনও ফাংশন, বা একটি চিহ্ন দেখা যায় তবে তা বাদ দেওয়া হয় (যখন এটি কোনও বস্তুতে পাওয়া যায়) বা নালকে সেন্সর করা হয় (যখন এটি অ্যারেতে পাওয়া যায়)"।


5

খাঁটি জাভাস্ক্রিপ্ট সহ: (যদিও অবজেক্ট.এন্ট্রিগুলি ES7, অবজেক্ট.সেসাইন ES6; তবে সমতুল্য ES5 অবজেক্ট.কিগুলি ব্যবহার করে কেবল এটি করণীয়ও হওয়া উচিত); v != nullনাল এবং অপরিজ্ঞাত উভয়ের জন্য চেকগুলিও লক্ষ্য করুন ;

> var d = { a:undefined, b:2, c:0, d:undefined, e: null, f: 0.3, s: "", t: false };
undefined
> Object.entries(d)
    .filter(([ k, v ]) => (v != null))
    .reduce((acc, [k, v]) => Object.assign(acc, {[k]: v}), {})
{ b: 2, c: 0, f: 0.3, s: '', t: false }

সম্পাদনা করুন: এটি নীচে কেবল ES5 অবজেক্ট.কিজ সহ সংস্করণ: তবে সাধারণত নোড ভি 8-তে ES7 সহ বেশ উপভোগযোগ্য ;-)

> Object.keys(d)
    .filter(function(k) { return d[k] != null; })
    .reduce(function(acc, k) { acc[k] = d[k]; return acc; }, {});
{ b: 2, c: 0, f: 0.3, s: '', t: false }

অক্টোবর 2017 এ আপডেট করুন : নোড ভি 8 এর সাথে (ভি 8.3 বা তার থেকে) এখন এতে অবজেক্ট স্প্রেড কনস্ট্রাক্ট রয়েছে:

> var d = { a:undefined, b:2, c:0, d:undefined,
    e: null, f: -0.0, s: "", t: false, inf: +Infinity, nan: NaN };
undefined
> Object.entries(d)
    .filter(([ k, v ]) => (v != null))
    .reduce((acc, [k, v]) => ({...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }

বা একের মধ্যে কেবল হ্রাস করুন:

> Object.entries(d)
   .reduce((acc, [k, v]) => (v==null ? acc : {...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }

আপডেট: কেউ পুনরুক্তি চান? তাও তেমন শক্ত নয়, কেবল আইসজেক্টের অতিরিক্ত চেকের প্রয়োজন, এবং পুনরাবৃত্তভাবে নিজেকে কল করুন:

> function isObject(o) {
    return Object.prototype.toString.call(o) === "[object Object]"; }
undefined
> function dropNullUndefined(d) {
    return Object.entries(d)
      .reduce((acc, [k, v]) => (
        v == null ? acc :
         {...acc, [k]: (isObject(v) ? dropNullUndefined(v) : v) }
      ), {});
  }
> dropNullUndefined({a: 3, b:null})
{ a: 3 }
> dropNullUndefined({a: 3, b:null, c: { d: 0, e: undefined }})
{ a: 3, c: { d: 0 } }

আমার উপসংহার: খাঁটি জাভাস্ক্রিপ্ট যদি করতে পারে তবে আমি কোনও তৃতীয় পক্ষের লাইব্রেরি নির্ভরতা এড়িয়ে যাব:


হ্রাস ব্যবহার এড়াতে আপনি Object.fromEntries ব্যবহার করতে পারেন : Object.fromEntries (Object.entries (d) .filter (([k, v]) => (v! = নাল)))
পিপিয়ার

5

যেহেতু আপনার মধ্যে কেউ কেউ প্রশ্নটিতে এসে পৌঁছেছেন কেবলমাত্র সরিয়ে দেওয়ার জন্য undefined, তাই আপনি ব্যবহার করতে পারেন:

  • লোডাশ পদ্ধতির সংমিশ্রণ

    _.omitBy(object, _.isUndefined)
  • rundefপ্যাকেজ, যা শুধুমাত্র সরিয়ে ফেলা undefinedবৈশিষ্ট্য

    rundef(object)

আপনার যদি পুনরাবৃত্তভাবেundefined বৈশিষ্ট্যগুলি অপসারণ করতে হয় তবে rundefপ্যাকেজের একটি recursiveবিকল্পও রয়েছে।

rundef(object, false, true);

আরও বিশদ জন্য ডকুমেন্টেশন দেখুন ।


3

এখানে আমি যাচ্ছি লোডাশ পদ্ধতির:

_(my_object)
    .pairs()
    .reject(function(item) {
        return _.isUndefined(item[1]) ||
            _.isNull(item[1]);
    })
    .zipObject()
    .value()

জোড়া () ফাংশন কী / মান অ্যারে একটি অ্যারের মধ্যে ইনপুট বস্তুর সক্রিয়। আপনি এটি এটি করেন যাতে অপসারণ () অপসারণ undefinedএবং nullমানগুলি ব্যবহার করা সহজ । এর পরে, আপনি এমন জুটি রেখে গেছেন যা প্রত্যাখ্যান করা হয়নি, এবং এগুলি ইনপুট হ'ল জিপবজেক্ট () , যা আপনার জন্য আপনার অবজেক্টকে পুনর্গঠন করে।


3

undefined == nullআমরা নিম্নলিখিত হিসাবে লিখতে পারি যে অ্যাকাউন্ট গ্রহণ করা :

let collection = {
  a: undefined,
  b: 2,
  c: 4,
  d: null,
}

console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }

জেএসবিন উদাহরণ


1
এটি পুনর্বিবেচনা করছে ... নিশ্চিত নয় কেন তবে এবার আমাকে _.omitBy ... json = _.omitBy (json, (এটি) => এটি == নাল) ব্যবহার করতে হয়েছিল;
danday74



1

লোডাশ (বা আন্ডারস্কোর) সহ আপনি করতে পারেন

var my_object = { a:undefined, b:2, c:4, d:undefined, e:null };

var passedKeys = _.reject(Object.keys(my_object), function(key){ return _.isUndefined(my_object[key]) || _.isNull(my_object[key]) })

newObject = {};
_.each(passedKeys, function(key){
    newObject[key] = my_object[key];
});

অন্যথায়, ভ্যানিলা জাভাস্ক্রিপ্ট সহ, আপনি এটি করতে পারেন

var my_object = { a:undefined, b:2, c:4, d:undefined };
var new_object = {};

Object.keys(my_object).forEach(function(key){
    if (typeof my_object[key] != 'undefined' && my_object[key]!=null){
        new_object[key] = my_object[key];
    }
});

ভুয়া পরীক্ষা ব্যবহার না করা, কারণ কেবল "অপরিজ্ঞাত" বা "নাল" প্রত্যাখ্যান করা হবে না , এটি অন্যান্য মিথ্যা মান যেমন "মিথ্যা", "0", খালি স্ট্রিং,}}} সুতরাং, কেবল এটি সহজ এবং বোধগম্য করার জন্য, আমি উপরে কোডেড হিসাবে সুস্পষ্ট তুলনা ব্যবহার করতে পছন্দ করেছি।


1
এটি যদিও পুনরাবৃত্তিযোগ্য নয়
ব্যবহারকারী 3743222

1

সমস্ত মিথ্যা মানগুলি বাদ দিতে কিন্তু বুলিয়ান আদিমিকে এই সমাধানে সহায়তা করে।

_.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));

let fields = {
str: 'CAD',
numberStr: '123',
number  : 123,
boolStrT: 'true',
boolStrF: 'false',
boolFalse : false,
boolTrue  : true,
undef: undefined,
nul: null,
emptyStr: '',
array: [1,2,3],
emptyArr: []
};

let nobj = _.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));

console.log(nobj);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>


0
var my_object = { a:undefined, b:2, c:4, d:undefined };

var newObject = _.reject(my_collection, function(val){ return _.isUndefined(val) })

//--> newCollection = { b: 2, c: 4 }

1
_.রেজ ইনপুটটিকে অ্যারে হিসাবে বিবেচনা করে (এটি কেবল মানগুলির জন্য অ্যাকাউন্ট করে, কীগুলি নয়), কোনও জেএসওএন নয়। ফলস্বরূপ নতুনবজেক্টটি [2,4] is b: 2, c: 4 not নয়} আরও, এটি "নাল" কীটি প্রত্যাখ্যান করে না।
টাওপিআর

0

আমি আন্ডারস্কোর ব্যবহার করব এবং খালি স্ট্রিংগুলিরও যত্ন নেব:

var my_object = { a:undefined, b:2, c:4, d:undefined, k: null, p: false, s: '', z: 0 };

var result =_.omit(my_object, function(value) {
  return _.isUndefined(value) || _.isNull(value) || value === '';
});

console.log(result); //Object {b: 2, c: 4, p: false, z: 0}

jsbin


0

গভীর নেস্টেড অবজেক্ট এবং অ্যারেগুলির জন্য। এবং স্ট্রিং এবং NaN থেকে খালি মানগুলি বাদ দিন

function isBlank(value) {
  return _.isEmpty(value) && !_.isNumber(value) || _.isNaN(value);
}
var removeObjectsWithNull = (obj) => {
  return _(obj).pickBy(_.isObject)
    .mapValues(removeObjectsWithNull)
    .assign(_.omitBy(obj, _.isObject))
    .assign(_.omitBy(obj, _.isArray))
    .omitBy(_.isNil).omitBy(isBlank)
    .value();
}
var obj = {
  teste: undefined,
  nullV: null,
  x: 10,
  name: 'Maria Sophia Moura',
  a: null,
  b: '',
  c: {
    a: [{
      n: 'Gleidson',
      i: 248
    }, {
      t: 'Marta'
    }],
    g: 'Teste',
    eager: {
      p: 'Palavra'
    }
  }
}
removeObjectsWithNull(obj)

ফলাফল:

{
   "c": {
      "a": [
         {
            "n": "Gleidson",
            "i": 248
         },
         {
            "t": "Marta"
         }
      ],
      "g": "Teste",
      "eager": {
         "p": "Palavra"
      }
   },
   "x": 10,
   "name": "Maria Sophia Moura"
}

0

আমি _.পিকবি ব্যবহার করতে পছন্দ করি, কারণ আপনি যা অপসারণ করছেন তাতে আপনার সম্পূর্ণ নিয়ন্ত্রণ রয়েছে:

var person = {"name":"bill","age":21,"sex":undefined,"height":null};

var cleanPerson = _.pickBy(person, function(value, key) {
  return !(value === undefined || value === null);
});

উত্স: https://www.codegrepper.com/?search_term=lodash+remove+ অপরিবর্তিত+ মানগুলি +++ অবজেক্ট


0

আপনারা যারা এখানে আসছেন তারা অবজেক্টগুলির একটি অ্যারে থেকে সরানোর জন্য এবং লোডাশ ব্যবহার করে আপনি এর মতো কিছু করতে পারেন:


 const objects = [{ a: 'string', b: false, c: 'string', d: undefined }]
 const result = objects.map(({ a, b, c, d }) => _.pickBy({ a,b,c,d }, _.identity))

 // [{ a: 'string', c: 'string' }]

দ্রষ্টব্য: আপনি না চাইলে আপনাকে ধ্বংস করতে হবে না।

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