712

条件付きでメンバーを追加したオブジェクトを作成したいのですが。簡単なアプローチは次のとおりです。

var a = {};
if (someCondition)
    a.b = 5;

それでは、もっと慣用的なコードを書きたいと思います。やっています:

a = {
    b: (someCondition? 5 : undefined)
};

しかし今、はその値が。bのメンバーです。これは望ましい結果ではありません。aundefined

便利な解決策はありますか?

アップデート

私は、複数のメンバーがいる一般的なケースを処理できるソリューションを探しています。

a = {
  b: (conditionB? 5 : undefined),
  c: (conditionC? 5 : undefined),
  d: (conditionD? 5 : undefined),
  e: (conditionE? 5 : undefined),
  f: (conditionF? 5 : undefined),
  g: (conditionG? 5 : undefined),
 };
4

24 に答える 24

1560

@InspiredJW は ES5 でそれを行ったと思います。@trincot が指摘したように、es6 を使用する方がより良いアプローチです。しかし、スプレッド演算子と論理 AND 短絡評価を使用して、もう少し砂糖を追加できます。

const a = {
   ...(someCondition && {b: 5})
}
于 2016-11-12T08:22:24.297 に答える
138

純粋な Javascript では、最初のコード スニペットよりも慣用的なものは考えられません。

ただし、jQuery ライブラリの使用が問題外でない場合は、$.extend()が要件を満たす必要があります。これは、ドキュメントに次のように記載されているためです。

未定義のプロパティはコピーされません。

したがって、次のように書くことができます。

var a = $.extend({}, {
    b: conditionB ? 5 : undefined,
    c: conditionC ? 5 : undefined,
    // and so on...
});

期待どおりの結果が得られます (conditionBがの場合false、 にbは存在しませんa)。

于 2012-07-28T20:45:40.753 に答える
113

EcmaScript2015 では、以下を使用できますObject.assign

Object.assign(a, conditionB ? { b: 1 } : null,
                 conditionC ? { c: 2 } : null,
                 conditionD ? { d: 3 } : null);

var a, conditionB, conditionC, conditionD;
conditionC = true;
a = {};
Object.assign(a, conditionB ? { b: 1 } : null,
                 conditionC ? { c: 2 } : null,
                 conditionD ? { d: 3 } : null);

console.log(a);

いくつかのコメント:

さらに簡潔に

2番目のポイントをさらに進めると、次のように短縮できます(@Jamieが指摘したように)。偽の値には独自の列挙可能なプロパティ( false, 0, NaN, null, undefined,''を除くdocument.all):

Object.assign(a, conditionB && { b: 1 },
                 conditionC && { c: 2 },
                 conditionD && { d: 3 });

var a, conditionB, conditionC, conditionD;
conditionC = "this is truthy";
conditionD = NaN; // falsy
a = {};
Object.assign(a, conditionB && { b: 1 },
                 conditionC && { c: 2 },
                 conditionD && { d: 3 });
console.log(a);

于 2016-07-20T14:10:35.617 に答える
44

より単純化し、

const a = {
    ...(condition && {b: 1}) // if condition is true 'b' will be added.
}
于 2020-04-01T08:34:26.317 に答える
9

私はこれをするだろう

var a = someCondition ? { b: 5 } : {};
于 2012-07-28T20:10:40.423 に答える
7

オブジェクトを自己完結型に見せ、1 セットの中括弧内に収めることが目標である場合は、次のように試すことができます。

var a = new function () {
    if (conditionB)
        this.b = 5;

    if (conditionC)
        this.c = 5;

    if (conditionD)
        this.d = 5;
};
于 2012-07-28T20:57:38.850 に答える
5

これには長い間答えがありましたが、他のアイデアを見て、興味深い派生物を思いつきました:

未定義の値を同じプロパティに割り当て、後で削除する

匿名コンストラクターを使用してオブジェクトを作成し、最後に削除する同じダミーメンバーに常に未定義のメンバーを割り当てます。これにより、メンバーごとに 1 行 (あまり複雑ではないことを願っています) + 最後に 1 行が追加されます。

var a = new function() {
    this.AlwaysPresent = 1;
    this[conditionA ? "a" : "undef"] = valueA;
    this[conditionB ? "b" : "undef"] = valueB;
    this[conditionC ? "c" : "undef"] = valueC;
    this[conditionD ? "d" : "undef"] = valueD;
    ...
    delete this.undef;
};
于 2014-12-10T01:54:55.853 に答える
1

lodash ライブラリを使用すると、_.omitByを使用できます

var a = _.omitBy({
    b: conditionB ? 4 : undefined,
    c: conditionC ? 5 : undefined,
}, _.IsUndefined)

これは、オプションのリクエストがある場合に便利です

var a = _.omitBy({
    b: req.body.optionalA,  //if undefined, will be removed
    c: req.body.optionalB,
}, _.IsUndefined)
于 2018-05-18T22:59:06.383 に答える
0

条件付きでメンバーを追加する最初のアプローチはまったく問題ないと思います。の値を持つのメンバーbを持ちたくないということに私は本当に同意しません。演算子でループを使用してチェックを追加するのは簡単です。しかしとにかく、メンバーを除外する関数を簡単に書くことができます。aundefinedundefinedforinundefined

var filterUndefined = function(obj) {
  var ret = {};
  for (var key in obj) {
    var value = obj[key];
    if (obj.hasOwnProperty(key) && value !== undefined) {
      ret[key] = value;
    }
  }
  return ret;
};

var a = filterUndefined({
  b: (conditionB? 5 : undefined),
  c: (conditionC? 5 : undefined),
  d: (conditionD? 5 : undefined),
  e: (conditionE? 5 : undefined),
  f: (conditionF? 5 : undefined),
  g: (conditionG? 5 : undefined),
});

delete演算子を使用して、オブジェクトを所定の位置で編集することもできます。

于 2012-07-28T20:50:24.190 に答える
-1

var byletを定義し、新しいプロパティを割り当てるだけです

let msg = {
    to: "hito@email.com",
    from: "hifrom@email.com",
    subject: "Contact form",    
};

if (file_uploaded_in_form) { // the condition goes here
    msg.attachments = [ // here 'attachments' is the new property added to msg Javascript object
      {
        content: "attachment",
        filename: "filename",
        type: "mime_type",
        disposition: "attachment",
      },
    ];
}

今、msgなる

{
    to: "hito@email.com",
    from: "hifrom@email.com",
    subject: "Contact form",
    attachments: [
      {
        content: "attachment",
        filename: "filename",
        type: "mime_type",
        disposition: "attachment",
      },
    ]
}

私の意見では、これは非常にシンプルで簡単な解決策です。

于 2020-06-16T15:14:29.333 に答える