2017-04-26 16 views
0

某種類似陣列我有兩個數組:使用JS下劃線合併和關鍵

"array_one": 
[ 
    { 
    "id": 1, 
    "name": One 
    }, 
    { 
    "id": 2, 
    "name": Two 
    } 
] 

"array_two": 
[ 
    { 
    "id": 1, 
    "name": Uno 
    }, 
    { 
    "id": 3, 
    "name": Three 
    } 
] 

我需要使用下劃線:

  1. 覆蓋在array_one所有對象與具有對象從array_two匹配id。

  2. 如果沒有其他對象與它們的id已存在,則將array_two中的所有對象追加到array_one中。

  3. 被覆蓋的對象應保留其指數在數組中

  4. 追加對象必須在陣列

所以最終的結果看起來像的末尾添加:

"array_final": 
[ 
    { 
    "id": 1, 
    "name": Uno 
    }, 
    { 
    "id": 2, 
    "name": Two 
    }, 
    { 
    "id": 3, 
    "name": Three 
    } 
] 
+0

你嘗試過這麼遠嗎? – AlexD

回答

0

var array1 = 
 
[ 
 
    { 
 
    "id": 1, 
 
    "name": 'One' 
 
    }, 
 
    { 
 
    "id": 2, 
 
    "name": 'Two' 
 
    } 
 
]; 
 

 
var array2 = 
 
[ 
 
    { 
 
    "id": 1, 
 
    "name": 'Uno' 
 
    }, 
 
    { 
 
    "id": 3, 
 
    "name": 'Three' 
 
    } 
 
]; 
 

 

 
function mapArrays(arr1, arr2) { 
 
    
 
    var tmp = _.map(arr1, function(val) { 
 
    var o = _.first(_.filter(arr2, function(a2) { return a2.id === val.id; })); 
 
    return !!o ? o : val; 
 
    }); 
 
    
 
    return _.union(tmp, _.filter(arr2, function(val) { return !_.some(tmp, function(a2) { a2.id == val.idl }); })); 
 
} 
 

 
var final = mapArrays(array1, array2); 
 

 
console.log(final);
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

+0

完美。謝謝。 – Fish

0

您可以使用兩個對象作爲哈希表來跟蹤添加的對象,另一個用於第二個數組。然後,如果在第二個數組中找到第一個數組,則使用reduce來替換對象中的對象,最後再使用一個for循環來添加第二個數組中剩餘的對象。

var data = { 
 
    "array_one": [{ 
 
    "id": 1, 
 
    "name": 'One' 
 
    }, { 
 
    "id": 2, 
 
    "name": 'Two' 
 
    }], 
 
    "array_two": [{ 
 
    "id": 1, 
 
    "name": 'Uno' 
 
    }, { 
 
    "id": 3, 
 
    "name": 'Three' 
 
    }] 
 
} 
 

 
var obj = {}, added = {} 
 
data.array_two.forEach(e => obj[e.id] = e) 
 

 
var result = {finalArray: data.array_one.reduce(function(r, e) { 
 
    r.push(obj[e.id] ? (added[e.id] = 1, obj[e.id]) : e); 
 
    return r; 
 
}, [])} 
 

 
for(var i in obj) if(!added[obj[i].id]) result.finalArray.push(obj[i]) 
 

 
console.log(result)