2017-12-07 6 views
-1

が存在する場合にのみ、私は、彼らがすでに存在する場合にのみ、オブジェクトの内部プロパティを設定するために探しています_.set。 Lodash _.setは、存在しない場合は階層全体を作成します。Lodashは、オブジェクトが

これを行う簡単な方法はありますか? (なければ、文場合は?)以下

スニペット:

const obj = {a: {b: 1}}; 
 

 
_.set(obj, 'a.b', 2); 
 

 
console.log(obj); // Great ! 
 

 
_.set(obj, 'a.c', 1); 
 

 
console.log(obj); // Great but not what I want. I would like c not to be set because it does not exist in the first place
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+4

最初の '_.has'でそれを確認してください? – zerkms

+1

https://lodash.com/docs/4.17.4#has – charlietfl

答えて

0

答えを以下Kalaiselvan Aからは途中で私を置くが、これは非常にではありません私が探していたもの

同じ考えを使用したが、三元を改善するには、私がして満足している以下のソリューションを提供します。

const obj = {a: {b: 1}}; 
 

 
_.has(obj, 'a.b') && _.set(obj, 'a.b', 2); 
 

 
console.log(obj); 
 

 
_.has(obj, 'a.c') && _.set(obj, 'a.c', 2); 
 

 
console.log(obj);
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>

3

あなたはこの方法であなたはトイレができ

const obj = {a: {b: 1}}; 
 

 
_.set(obj, 'a.b', 2); 
 

 
console.log(obj); // Great ! 
 
_.has(obj,'a.c')==true?_.set(obj, 'a.c', 1):"" 
 

 
console.log(obj); // Great but not what I want. I would like c not to be set because it does not exist in the first place
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

+0

@zerkmsが正しく言及されました。 –

+0

は素晴らしいですが、OPの自己課税制限を破っています。「除外してください」と書かれています。 –

+1

@JaromandaX私は個人的にOPその要件を正当化します。これは無視しても安全です。私は "それは機能しない"のようなものが来るだろうと賭けた。 – zerkms

1

を試すことができますけれども、あなたは「深く」オブジェクトをシールすることをお勧めしますObject.seal

でK:

const sealDeep = obj => { 
 
    const sealProps = o => { 
 
     Object.values(o).forEach(value => { 
 
      if (typeof value === 'object') { 
 
       sealProps(value); 
 
       Object.seal(value); 
 
      } 
 
     }); 
 
    }; 
 
    sealProps(obj); 
 
    Object.seal(obj); 
 
}; 
 

 
var x = { 
 
    hello: { 
 
     world: { 
 
      foo: 1, 
 
      bar: 2 
 
     }, 
 
     bat: '3' 
 
    }, 
 
    foo2: 4 
 
}; 
 
sealDeep(x); 
 
console.log(JSON.stringify(x)); 
 
x.newthing = 999; 
 
x.hello.newthing = 999; 
 
x.hello.world.newthing = 999; 
 
x.hello.world.foo = 999; 
 
console.log(JSON.stringify(x));

+0

興味深い解決策だが、私が探していた1つのライナーからは遠い。これはコードレビューを決して通過しません;) – klugjo

+0

sealDeep関数をスニークします。その後、それは1つのライナーです –

+1

私のアプリは何千ものコード行にあります。ここの厄介な副作用の可能性は高すぎます。 – klugjo

関連する問題