web-dev-qa-db-ja.com

Javascript-未定義フィールドをオブジェクトから削除する

オブジェクトから未定義のフィールドを削除するクリーンな方法はありますか?

つまり.

> var obj = { a: 1, b: undefined, c: 3 }
> removeUndefined(obj)
{ a: 1, c: 3 }

私は2つのソリューションに出会いました:

_.each(query, function removeUndefined(value, key) {
  if (_.isUndefined(value)) {
    delete query[key];
  }
});

または:

_.omit(obj, _.filter(_.keys(obj), function(key) { return _.isUndefined(obj[key]) }))
50
Damian

ES6矢印関数と三項演算子を使用した1行のライナー:

Object.keys(obj).forEach(key => obj[key] === undefined ? delete obj[key] : '');

または、3進数の代わりにshort-circuit評価を使用します:(@Matt Langlois、情報をありがとう!)

Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key])

jsbin

If式を使用した同じ例:

Object.keys(obj).forEach(key => {
  if (obj[key] === undefined) {
    delete obj[key];
  }
});

null''、およびundefinedを削除する場合は、!obj[key]の代わりにobj[key] === undefinedを使用します。

ネストされたオブジェクトからもアイテムを削除する場合は、recursive関数を使用できます。

const removeEmpty = (obj) => {
  Object.keys(obj).forEach(key => {
    if (obj[key] && typeof obj[key] === 'object') removeEmpty(obj[key]);
    else if (obj[key] === undefined) delete obj[key];
  });
  return obj;
};

jsbin

88
Rotareti

_var obj = { a: 1, b: undefined, c: 3 }_

オブジェクトのundefined小道具を削除するには、次のように使用します

JSON.parse(JSON.stringify(obj));

出力: _{a: 1, c: 3}_

44
nmanikiran

Lodashのようなものを使用することを好みます。

import { pickBy, identity } from 'lodash'

const cleanedObject = pickBy(originalObject, identity)

アイデンティティ関数はただx => xとその結果は、すべての偽の値に対してfalseになります。したがって、これは未定義の「」、0、null、...を削除します.

undefined値のみを削除する場合は、次の操作を実行できます。

const cleanedObject = pickBy(originalObject, v => v !== undefined)

それはあなたに新しいオブジェクトを与えます。これは通常、他の答えのいくつかが示唆するように、元のオブジェクトを変更するよりも望ましいです。

34

また、このソリューションでは、 Object.keys が特定のオブジェクトの列挙可能なプロパティの配列を返すため、hasOwnProperty()も回避されます。

Object.keys(obj).forEach(function (key) {
 if(typeof obj[key] === 'undefined'){
    delete obj[key];
  }
});

これをnullまたは''として追加して、より厳密なクリーニングを行うことができます。

12
Alvaro Pinot

それは言及されていないようですので、ここに私の好みの方法、sans副作用または外部依存関係があります:

const obj = {
  a: 1,
  b: undefined
}

const newObject = Object.keys(obj).reduce((acc, key) => {
  const _acc = acc;
  if (obj[key] !== undefined) _acc[key] = obj[key];
  return _acc;
}, {})

console.log(newObject)
// Object {a: 1}
11
ptim

これは覚えやすいですが、遅いかもしれません。 jQueryを使用して、null以外のプロパティを空のオブジェクトにコピーします。 trueを最初の引数として追加しない限り、ディープコピーはありません。

myObj = $.extend({}, myObj);
3
Fredrik

プレーンなJavaScript(ライブラリは不要)のソリューションは次のとおりです。

function removeUndefinedProps(obj) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] === undefined) {
            delete obj[prop];
        }
    }
}

動作デモ: http://jsfiddle.net/jfriend00/djj5g5fu/

2
jfriend00

Mhh .. @Damianはremove undefined field (property) from an JS objectを要求すると思います。その後、私は単にやるだろう:

for (const i in myObj)  
   if (typeof myObj[i] === 'undefined')   
     delete myObj[i]; 

(Vanilla)JSの短くて効率的なソリューション!例:

const myObj = {
  a: 1,
  b: undefined,
  c: null, 
  d: 'hello world'
};

for (const i in myObj)  
  if (typeof myObj[i] === 'undefined')   
    delete myObj[i]; 

console.log(myObj);
1
Dam Fa

別のJavascriptソリューション

for(var i=0,keys = Object.keys(obj),len=keys.length;i<len;i++){ 
  if(typeof obj[keys[i]] === 'undefined'){
    delete obj[keys[i]];
  }
}

Object.keysはプロトタイプチェーンを検索せず、hasOwnPropertyのプロパティのみを返すため、追加のobjチェックは不要です。

[〜#〜] demo [〜#〜]

0
Prabhu Murthy