2017-08-21 4 views
0

次のように私はJavaScriptのオブジェクトを持っている:JavaScriptオブジェクトで重複するキーをマージするにはどうすればよいですか?

{ 
    "zone": [{ 
     "$origin": "domainname.com.", 
     "a": [{ 
       "name": "ironman", 
       "ip": "192.168.0.1" 
      }, { 
       "name": "thor", 
       "ip": "192.168.0.2" 
      }, 
      { 
       "name": "odin", 
       "ip": "192.168.0.3" 
      } 
     ] 

    }, { 
     "$origin": "domainname.com.", 
     "a": [{ 
       "name": "javis", 
       "ip": "192.168.0.4" 
      }, 
      { 
       "name": "jump", 
       "ip": "192.168.0.5" 
      }, 
      { 
       "name": "jupiter", 
       "ip": "192.168.0.6" 
      } 
     ] 
    }] 
} 

私は重複したキーをマージする方法を知っている「$原点」で重複キーをマージし、「」キー

{ 
    "zone": [{ 
     "$origin": "domainname.com.", 
     "a": [{ 
       "name": "ironman", 
       "ip": "192.168.0.1" 
      }, { 
       "name": "thor", 
       "ip": "192.168.0.2" 
      }, 
      { 
       "name": "odin", 
       "ip": "192.168.0.3" 
      }, 
      { 
       "name": "javis", 
       "ip": "192.168.0.4" 
      }, 
      { 
       "name": "jump", 
       "ip": "192.168.0.5" 
      }, 
      { 
       "name": "jupiter", 
       "ip": "192.168.0.6" 
      } 
     ] 

    }] 
} 

に値を追加したいです他のトピックから2つの異なるオブジェクトから、私はどのようにマージし、同じオブジェクト内の重複するキーを見つけるか分からない。

答えて

1

まず、reduceを使用して複製を収集し、$originの値をキーとする一時オブジェクトに保存します。次に、キーを反復してオブジェクトを再構築します。

もう1つの方法は、フィルタリングを使用してreduceメソッドのほとんどの作業を行いますが、私の現在の解決策はより速いと思います。

const data = { 
 
    "zone": [{ 
 
     "$origin": "domainname.com.", 
 
     "a": [{ 
 
       "name": "ironman", 
 
       "ip": "192.168.0.1" 
 
      }, { 
 
       "name": "thor", 
 
       "ip": "192.168.0.2" 
 
      }, 
 
      { 
 
       "name": "odin", 
 
       "ip": "192.168.0.3" 
 
      } 
 
     ] 
 

 
    }, { 
 
     "$origin": "domainname.com.", 
 
     "a": [{ 
 
       "name": "javis", 
 
       "ip": "192.168.0.4" 
 
      }, 
 
      { 
 
       "name": "jump", 
 
       "ip": "192.168.0.5" 
 
      }, 
 
      { 
 
       "name": "jupiter", 
 
       "ip": "192.168.0.6" 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     "$origin": "eomainname.com.", 
 
     "a": [{ 
 
       "name": "javis", 
 
       "ip": "192.168.0.4" 
 
      }, 
 
      { 
 
       "name": "jump", 
 
       "ip": "192.168.0.5" 
 
      }, 
 
      { 
 
       "name": "jupiter", 
 
       "ip": "192.168.0.6" 
 
      } 
 
     ] 
 
    }] 
 
} 
 

 
const result = { zone: [] } 
 
const tmp = data.zone.reduce((acc, curr) => { 
 
    if (acc.hasOwnProperty(curr.$origin)) { 
 
    acc[curr.$origin] = acc[curr.$origin].concat(curr.a) 
 
    } else { 
 
    acc[curr.$origin] = curr.a 
 
    } 
 
    return acc; 
 
}, {}) 
 

 
result.zone = Object.keys(tmp).map((key) => { 
 
    return { 
 
    $origin: key, 
 
    a: tmp[key] 
 
    } 
 
}) 
 

 
console.log(result)

+0

でオブジェクトの値をプッシュし続けることができる非常にありがとう多く:) –

0

あなたは、配列をループインデックスは1から始まり、インデックス0

let x = { 
 
    "zone": [{ 
 
    "$origin": "domainname.com.", 
 
    "a": [{ 
 
     "name": "ironman", 
 
     "ip": "192.168.0.1" 
 
     }, { 
 
     "name": "thor", 
 
     "ip": "192.168.0.2" 
 
     }, 
 
     { 
 
     "name": "odin", 
 
     "ip": "192.168.0.3" 
 
     } 
 
    ] 
 

 
    }, { 
 
    "$origin": "domainname.com.", 
 
    "a": [{ 
 
     "name": "javis", 
 
     "ip": "192.168.0.4" 
 
     }, 
 
     { 
 
     "name": "jump", 
 
     "ip": "192.168.0.5" 
 
     }, 
 
     { 
 
     "name": "jupiter", 
 
     "ip": "192.168.0.6" 
 
     } 
 
    ] 
 
    }] 
 
} 
 
// starting to loop from index 1, new elements will be pushed 
 
    to the object at index 0 
 
for (var i = 1; i < x.zone.length; i++) { 
 
    // looping through the array of object at index 1 ... 
 
    x.zone[i].a.forEach(function(item) { 
 
    // dummy object which will have values from other objects 
 
    let dumObj = {}; 
 
    dumObj.name = item.name; 
 
    dumObj.ip = item.ip; 
 
    
 
    x.zone[0].a.push(dumObj); 
 
    }) 
 
} 
 

 
console.log(x)

関連する問題