簡體   English   中英

通過鍵組合對象數組

[英]combine array of objects by key

我正在嘗試通過案例ID中的鍵來組合/合並2個對象數組。

目的:

  1. 我期望有一個結果,我將按照示例包含包含ID為1,2,3,4的所有對象的數組
  2. 合並的順序不應影響對象的數量,例如combine(arr1,arr2)combine(arr2,arr1)數組應具有相同數量的對象
  3. 合並的順序只會影響結果對象,例如,在combine(arr1,arr2) arr2鍵的情況下,值對可以覆蓋arr1鍵,值就像深度jquery一樣擴展$ .extend(true,arr1ObJ,arr2ObJ);

JSFIDDLE: https ://jsfiddle.net/bababalcksheep/u2c05nyj/

樣本數據:

var arr1 = [{
  id: 1,
  name: "fred",
  title: "boss"
}, {
  id: 2,
  name: "jim",
  title: "nobody"
}, {
  id: 3,
  name: "bob",
  title: "dancer"
}];
var arr2 = [{
  id: 1,
  wage: "300",
  rate: "day"
}, {
  id: 2,
  wage: "10",
  rate: "hour"
}, {
  id: 4,
  wage: "500",
  rate: "week"
}];
var Result = [{
  "id": 1,
  "name": "fred",
  "title": "boss",
  "wage": "300",
  "rate": "day"
}, {
  "id": 2,
  "name": "jim",
  "title": "nobody",
  "wage": "10",
  "rate": "hour"
}, {
  id: 3,
  name: "bob",
  title: "dancer" 
}, {
  id: 4,
  wage: "500",
  rate: "week"
}];

這是一個解決方案。 它基本上遍歷了arr2的每個元素,並檢查是否存在一個具有匹配ID arr1的元素。 如果是這樣,它將使用arr2的值更新arr1中的匹配元素。 如果沒有匹配項,它只是將arr2中的元素推到arr1上。

var arr1 = [{id: 1,name: 'fred',title: 'boss'}, 
            {id: 2,name: 'jim',title: 'nobody'}, 
            {id: 3,name: 'bob',title: 'dancer'}];

var arr2 = [{id: 1,wage: '300',rate: 'day'}, 
            {id: 2,wage: '10',rate:'hour'},
            {id: 4,wage: '500',rate: 'week'}];

function combineArrays(arr1, arr2) {
  for(var i = 0; i < arr2.length; i++) {
    // check if current object exists in arr1
    var idIndex = hasID(arr2[i]['id'], arr1);
    if(idIndex >= 0){
      //update
      for(var key in arr2[i]){
        arr1[idIndex][key] = arr2[i][key];
      }
    } else {
      //insert
      arr1.push(arr2[i]);
    }
  }

  return arr1;
}

//Returns position in array that ID exists
function hasID(id, arr) {
  for(var i = 0; i < arr.length; i ++) {
    if(arr[i]['id'] === id)
    {
      return i;
    }
  }

  return -1;
}

var combine = combineArrays(arr1, arr2);
output(combine);

/* pretty Print */
function output(inp) {
  var str = JSON.stringify(inp, undefined, 4);
  $('body').append($('<pre/>').html(str));
}

 var arr1 = [{ id: 1, name: 'fred', title: 'boss' }, { id: 2, name: 'jim', title: 'nobody' }, { id: 3, name: 'bob', title: 'dancer' }]; var arr2 = [{ id: 1, wage: '300', rate: 'day' }, { id: 2, wage: '10', rate: 'hour' }, { id: 4, wage: '500', rate: 'week' }]; function combineArrays(arr1, arr2) { for (var i = 0; i < arr2.length; i++) { var idIndex = hasID(arr2[i]['id'], arr1); if (idIndex >= 0) { for (var key in arr2[i]) { arr1[idIndex][key] = arr2[i][key]; } } else { arr1.push(arr2[i]); } } return arr1; } function hasID(id, arr) { for (var i = 0; i < arr.length; i++) { if (arr[i]['id'] === id) { return i; } } return -1; } var combine = combineArrays(arr1, arr2); output(combine); /* pretty Print */ function output(inp) { var str = JSON.stringify(inp, undefined, 4); $('body').append($('<pre/>').html(str)); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 

這樣的事情怎么樣:

function combineArrays(arr1, arr2, keyFunc) {
    var combined = [],
        keys1 = arr1.map(keyFunc),
        keys2 = arr2.map(keyFunc),
        pos1 = keys1.map(function (id) {
            return keys2.indexOf(id);
        }),
        pos2 = keys2.map(function (id) {
            return keys1.indexOf(id);
        });

    arr1.forEach(function (item, i) {
        combined.push( $.extend(item, arr2[pos1[i]]) );
    });
    arr2.forEach(function (item, i) {
        if (pos2[i] === -1) combined.push( item );
    });
    return combined;    
}

用作

var combine = combineArrays(arr1, arr2, function (item) {
    return item.id;
});

 var arr1 = [ { id: 1, name: 'fred', title: 'boss' }, { id: 2, name: 'jim', title: 'nobody' }, { id: 3, name: 'bob', title: 'dancer' } ]; var arr2 = [ { id: 1, wage: '300', rate: 'day' }, { id: 2, wage: '10', rate: 'hour' }, { id: 4, wage: '500', rate: 'week' } ]; function combineArrays(arr1, arr2, keyFunc) { var combined = [], keys1 = arr1.map(keyFunc), keys2 = arr2.map(keyFunc), pos1 = keys1.map(function (id) { return keys2.indexOf(id); }), pos2 = keys2.map(function (id) { return keys1.indexOf(id); }); arr1.forEach(function (item, i) { combined.push( $.extend(item, arr2[pos1[i]]) ); }); arr2.forEach(function (item, i) { if (pos2[i] === -1) combined.push( item ); }); return combined; } var combine = combineArrays(arr1, arr2, function (item) { return item.id; }); output(combine); // // // /* pretty Print */ function output(inp) { var str = JSON.stringify(inp, undefined, 4); $('body').append($('<pre/>').html(str)); } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM