33135


初めて質問させていただきます。

[code]

    const state = {
          item: [
            {
              a: '',
              b: '',
              c: '',
              parts: [
                {
                  x: '',
                  y: '',
                  z: ''
                }
              ]
            }
          ]
        }
    
[/code]

上記のようなオブジェクトから指定のキーを検索して、その値を設定したいと考えています。

[code]

    function searchObj (obj, query) {
      for (var key in obj) {
        var value = obj[key]
        if (typeof value === 'object') {
          searchObj(value, query)
        }
        if (key === query) {
          return obj[key]
        }
      }
    }
    
[/code]

関数を設定して、返り値でもらったプロパティキーの値を設定するようにしました。

[code]

    var key = searchObj(state.item[0], 'x'))
    key = 'value'
    
[/code]

この場合、'x'の値に'value'が入って欲しいのですが、どうしてもsearchObjの返り値が分からず質問させていただきました。  
どうぞ宜しくお願い致します。


CC BY-SA 3.0
2017-03-06T09:13:13.277
33132
2017-03-06T10:02:19.157
2017-03-06T09:36:39.340
20947
question
javascript
オブジェクトのキーを検索して、値を設定する


とりあえず、再帰的に呼び出すなら再帰呼び出しの結果を返さないと。あと `item` や `parts` にもマッチさせるなら、`key === query`
は先に書いた方が速いです。

[code]

    function searchObj (obj, query) {
      for (var key in obj) {
        var value = obj[key];
        if (key === query) {
          return obj[key];
        }
        if (typeof value === 'object') {
          let result = searchObj(value, query);
          if (result !== undefined) {
            return result;
          }
        }
      }
      return undefined;
    }
    
[/code]

これで検索はできますが、Javascriptでは **変数への参照やポインタを返すことはできません**
。代入演算子の挙動を変えるような方法もありません。ですから、

[code]

    var key = searchObj(state.item[0], 'x'))
    key = 'value'
    
[/code]

これをそのまま実現することは不可能です。

代わりの策を考えるとしたら、発見したプロパティに値を設定する関数を返すとか

[code]

    function searchObj (obj, query) {
      for (var key in obj) {
        var value = obj[key];
        if (key === query) {
          return function(val){ obj[key] = val; };
        }
        if (typeof value === 'object') {
          let result = searchObj(value, query);
          if (result !== undefined) {
            return result;
          }
        }
      }
      return undefined;
    }
    
    var setter = searchObj(state.item[0], 'x'));
    setter('value');
    
[/code]

発見したプロパティを含むオブジェクトを返すとか

[code]

    function searchObj (obj, query) {
      for (var key in obj) {
        var value = obj[key];
        if (key === query) {
          return obj;
        }
        if (typeof value === 'object') {
          let result = searchObj(value, query);
          if (result !== undefined) {
            return result;
          }
        }
      }
      return undefined;
    }
    
    var parent = searchObj(state.item[0], 'x'));
    parent.x = 'value';
    
[/code]

というところでしょうか。


CC BY-SA 3.0
2017-03-06T10:02:19.157
33135
2017-03-06T10:02:19.157
8000
33132
answer