2017-08-23 13 views
0

から1つのJSONオブジェクトで行方不明のキーを埋める私はobject2はから充填フィールドが欠落している必要がJSONオブジェクトオブジェクト1を持っています。JavaScriptが別のJSONオブジェクト

私は、この機能を使用するために使用される:

function fillObject(from, to) { 
    for (var key in from) { 
     if (from.hasOwnProperty(key)) { 
      if (Object.prototype.toString.call(from[key]) === '[object Object]') { 
       if (!to.hasOwnProperty(key)) { 
        to[key] = {}; 
       } 
       fillObject(from[key], to[key]); 
      } 
      else if (!to.hasOwnProperty(key)) { 
       to[key] = from[key]; 
      } 
     } 
    } 
} 

そしてそれは、両方のオブジェクトが同じ構造を持っていたすべての中に働きました。今度はの項目の中にのオブジェクト1は、実際には構造のどこにでも現れます。 オブジェクト1object2はの例(私はすべての不要なキーを削除したような構造は、面白いように見えるかもしれません)。助けを事前に

var object1 = [ 
    { 
     "position": 1, 
     "items": [ 
      { 
       "position": 1, "itemId": 431, "title": "Title 1" 
      }, 
      { 
       "position": 2, "itemId": 1162, "title": "Overwritten title" 
      } 
     ] 
    }, 
    { 
     "position": 2, 
     "groups": [ 
      { 
       "position": 1, 
       "items": [ 
        { 
         "position": 1, "itemId": 452, "title": "New title" 
        }, 
        { 
         "position": 2, "itemId": 1388, "title": "Title 4" 
        }, 
        { 
         "position": 3, "itemId": 1942, "title": "Title 5" 
        } 
       ] 
      }, 
      { 
       "position": 2, "itemId": 1942, "title": "Title 5" 
      }, 
      { 
       "position": 3, 
       "items": [ 
        { 
         "position": 1, "itemId": 431, "title": "Title 1" 
        }, 
        { 
         "position": 2, "itemId": 2000 
        }, 
        { 
         "position": 3, "itemId": 452, "title": "Title 2" 
        }, 
       ] 
      } 
     ] 
    }, 
    { 
     "position": 3, "itemId": 1388, "title": "Title 4" 
    }, 
    { 
     "position": 4, "itemId": 2000, "title": "Extra title" 
    } 
]; 

ありがとう:

var object1 = [ 
    { 
     "position": 1, 
     "items": [ 
      { 
       "position": 1, "itemId": 431 
      }, 
      { 
       "position": 2, "itemId": 1162, "title": "Overwritten title" 
      } 
     ] 
    }, 
    { 
     "position": 2, 
     "groups": [ 
      { 
       "position": 1 
       "items": [ 
        { 
         "position": 1, "itemId": 452, "title": "New title" 
        }, 
        { 
         "position": 2, "itemId": 1388 
        }, 
        { 
         "position": 3, "itemId": 1942 
        } 
       ] 
      }, 
      { 
       "position": 2, "itemId": 1942 
      }, 
      { 
       "position": 3, 
       "items": [ 
        { 
         "position": 1, "itemId": 431 
        }, 
        { 
         "position": 2, "itemId": 2000 
        }, 
        { 
         "position": 3, "itemId": 452 
        } 
       ] 
      } 
     ] 
    }, 
    { 
     "position": 3, "itemId": 1388 
    }, 
    { 
     "position": 4, "itemId": 2000, "title": "Extra title" 
    } 
]; 

var object2 [ 
    { "itemId": 431, "title": "Title 1" }, 
    { "itemId": 452, "title": "Title 2" }, 
    { "itemId": 1162, "title": "Title 3" }, 
    { "itemId": 1388, "title": "Title 4" }, 
    { "itemId": 1942, "title": "Title 5" }, 
    { "itemId": 2000 } 
]; 

は、そして、これは私が結果になりたいものです。あなたがプロパティでオブジェクトを識別することができることを提供

+0

[Object.assign()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)および[ Spread syntax](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_operator#Spread_in_object_literals)は、まだ分かっていない場合に役に立ちます。 – TW80000

+0

'itemId'プロパティを使ってオブジェクトを一意に識別できますか? –

答えて

0

itemId言う)あなたは以下の

  • 小さなサブタスクにタスクを分割行うことができます:欠落しているプロパティ、トラバースオブジェクト構造をコピーし、オブジェクト
  • に対応するソースを見つけることが
  • 小さなチャンクを機能として実装し、一緒に使用します。

const defaults = (target, src) => Object.keys(src) 
 
    .forEach(key => key in target || (target[key] = src[key])) 
 

 
const traverse = fn => traversable => { 
 
    fn(traversable) 
 
    
 
    const nested = Array.isArray(traversable) ? traversable : Object.values(traversable) 
 
    
 
    nested.filter(value => typeof value === 'object') 
 
     .forEach(traverse(fn)) 
 
} 
 

 
const fillById = id => sources => { 
 
    const mapping = new Map(sources.map(item => [item[id], item])) 
 
    
 
    return obj => { 
 
    const src = mapping.get(obj.itemId) 
 
    
 
    src && defaults(obj, src) 
 
    } 
 
} 
 

 
var object1 = [ 
 
    { 
 
     "position": 1, 
 
     "items": [ 
 
      { 
 
       "position": 1, "itemId": 431 
 
      }, 
 
      { 
 
       "position": 2, "itemId": 1162, "title": "Overwritten title" 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     "position": 2, 
 
     "groups": [ 
 
      { 
 
       "position": 1, 
 
       "items": [ 
 
        { 
 
         "position": 1, "itemId": 452, "title": "New title" 
 
        }, 
 
        { 
 
         "position": 2, "itemId": 1388 
 
        }, 
 
        { 
 
         "position": 3, "itemId": 1942 
 
        } 
 
       ] 
 
      }, 
 
      { 
 
       "position": 2, "itemId": 1942 
 
      }, 
 
      { 
 
       "position": 3, 
 
       "items": [ 
 
        { 
 
         "position": 1, "itemId": 431 
 
        }, 
 
        { 
 
         "position": 2, "itemId": 2000 
 
        }, 
 
        { 
 
         "position": 3, "itemId": 452 
 
        } 
 
       ] 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     "position": 3, "itemId": 1388 
 
    }, 
 
    { 
 
     "position": 4, "itemId": 2000, "title": "Extra title" 
 
    } 
 
]; 
 

 
var object2 = [ 
 
    { "itemId": 431, "title": "Title 1" }, 
 
    { "itemId": 452, "title": "Title 2" }, 
 
    { "itemId": 1162, "title": "Title 3" }, 
 
    { "itemId": 1388, "title": "Title 4" }, 
 
    { "itemId": 1942, "title": "Title 5" }, 
 
    { "itemId": 2000 } 
 
]; 
 

 

 

 
traverse(fillById('itemId')(object2))(object1) 
 

 
console.log(object1)

+0

私が取得している* Uncaught RangeError:あなたが書いたものを実行しようとすると、 'mapping.get(obj.itemId);'の最大呼び出しスタックサイズを超過しました。 – Dely

+0

私が悪いのは、私が前に追加した別のコードのものだった。 – Dely

関連する問題