2017-09-30 4 views
1

j'ai deux ensembles de données qui ressemblent à ceci:Unir deux ensembles de données à l'aide de javascript

var gatePos = [ 
    { gate: 1, x: 1177, y: 200 }, 
    { gate: 2, x: 1109, y: 200 }, 
    { gate: 3, x: 1042, y: 200 }, 
    { gate: 4, x: 975, y: 200 }, 
    { gate: 5, x: 908, y: 200 }, 
    { gate: 6, x: 842, y: 200 }, 
    { gate: 7, x: 774, y: 200 }, 
    { gate: 8, x: 708, y: 200 }, 
    { gate: 9, x: 641, y: 200 }, 
    { gate: 10, x: 578, y: 200 } 
]; 

et

[ 
    { 
    "gate": "8B", 
    "value": 126 
    }, 
    { 
    "gate": "9B", 
    "value": 268 
    }, 
    { 
    "gate": "10B", 
    "value": 91 
    }, 
    { 
    "gate": "21B", 
    "value": 9 
    }, 
    { 
    "gate": "24B", 
    "value": 1 
    }, 
    { 
    "gate": "JC", 
    "value": 48352 
    }, 
    { 
    "gate": "LOCALISER", 
    "value": 22 
    }, 
    { 
    "gate": 1, 
    "value": 34351 
    }, 
    { 
    "gate": 2, 
    "value": 37855 
    }, 
    { 
    "gate": 3, 
    "value": 38462 
    }, 
    { 
    "gate": 4, 
    "value": 38126 
    }, 
    { 
    "gate": 5, 
    "value": 40089 
    } 

, 
    { 
    "gate": 6, 
    "value": 39295 
    }, 
    { 
    "gate": 7, 
    "value": 36581 
    }, 
    { 
    "gate": 8, 
    "value": 33908 
    }, 
    { 
    "gate": 9, 
    "value": 31187 
    }, 
    { 
    "gate": 10, 
    "value": 22915 
    }, 
    { 
    "gate": 11, 
    "value": 5164 
    }, 
    { 
    "gate": 12, 
    "value": 9533 
    }, 
    { 
    "gate": 13, 
    "value": 6454 
    }, 
    { 
    "gate": 14, 
    "value": 5003 
    }, 
    { 
    "gate": 15, 
    "value": 1 
    }, 
    { 
    "gate": 21, 
    "value": 19804 
    }, 
    { 
    "gate": 22, 
    "value": 21239 
    }, 
    { 
    "gate": 23, 
    "value": 17779 
    }, 
    { 
    "gate": 24, 
    "value": 15213 
    }, 
    { 
    "gate": "-", 
    "value": 37562 
    } 
] 

Ils ont "la porte" comme la clé. Je souhaite « jointure gauche » en termes SQL mes ensembles de données, et ont une sortie comme ceci:

[{ gate: 1, x: 100, y: 200, value: 999 }, 
{ gate: 2, x: 150, y: 200, value: 1000}] 
... etc 

Quelqu'un peut-il me diriger dans la bonne direction pour atteindre cet objectif? J'utilise principalement d3.js mais je comprends qu'il n'a pas de support pour ce genre de chose donc je voudrais atteindre en standard js, même si vous pouvez me donner quelques termes à rechercher ou quelque chose serait une aide massive.

Si vous n'êtes pas familier avec la jointure à gauche de SQL, je voudrais que mon nouveau tableau contienne TOUTES les valeurs de var gatePos mais seulement les valeurs de MATCHING du deuxième ensemble de données.

+0

quelle est la condition de jointure? –

+0

Pour ceux qui ne connaissent pas _SQL Left Join_, attention à expliquer! –

+0

@ibrahimmahrir désolé, j'ai fait un edit pour expliquer – Waller

Répondre

2

Vous pouvez imiter left outer join avec une fonction et une table de hachage pour l'élément avec la même clé de jointure.

var gatePos = [{ gate: 1, x: 1177, y: 200 }, { gate: 2, x: 1109, y: 200 }, { gate: 3, x: 1042, y: 200 }, { gate: 4, x: 975, y: 200 }, { gate: 5, x: 908, y: 200 }, { gate: 6, x: 842, y: 200 }, { gate: 7, x: 774, y: 200 }, { gate: 8, x: 708, y: 200 }, { gate: 9, x: 641, y: 200 }, { gate: 10, x: 578, y: 200 }], 
 
    gateValues = [{ gate: "8B", value: 126 }, { gate: "9B", value: 268 }, { gate: "10B", value: 91 }, { gate: "21B", value: 9 }, { gate: "24B", value: 1 }, { gate: "JC", value: 48352 }, { gate: "LOCALISER", value: 22 }, { gate: 1, value: 34351 }, { gate: 2, value: 37855 }, { gate: 3, value: 38462 }, { gate: 4, value: 38126 }, { gate: 5, value: 40089 }, { gate: 6, value: 39295 }, { gate: 7, value: 36581 }, { gate: 8, value: 33908 }, { gate: 9, value: 31187 }, { gate: 10, value: 22915 }, { gate: 11, value: 5164 }, { gate: 12, value: 9533 }, { gate: 13, value: 6454 }, { gate: 14, value: 5003 }, { gate: 15, value: 1 }, { gate: 21, value: 19804 }, { gate: 22, value: 21239 }, { gate: 23, value: 17779 }, { gate: 24, value: 15213 }, { gate: "-", value: 37562 }], 
 
    result = function (left, right, on, key) { 
 
     var hash = Object.create(null), 
 
      result = left.map(function (o) { 
 
       return hash[o[on]] = Object.assign({}, o); 
 
      }); 
 
     right.forEach(function (o) { 
 
      if (hash[o[on]]) { 
 
       hash[o[on]][key] = o[key]; 
 
      } 
 
     }); 
 
     return result; 
 
    }(gatePos, gateValues, 'gate', 'value'); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

Vérifiez si ce code fonctionne pour vous:

var gatePos = [{ gate: 1, x: 1177, y: 200 },{ gate: 2, x: 1109, y: 200 },{ gate: 3, x: 1042, y: 200 },{ gate: 4, x: 975, y: 200 },{ gate: 5, x: 908, y: 200 },{ gate: 6, x: 842, y: 200 },{ gate: 7, x: 774, y: 200 },{ gate: 8, x: 708, y: 200 },{ gate: 9, x: 641, y: 200 },{ gate: 10, x: 578, y: 200 }]; 
var gatePosValue = [{"gate":"8B","value":126},{"gate":"9B","value":268},{"gate":"10B","value":91},{"gate":"21B","value":9},{"gate":"24B","value":1},{"gate":"JC","value":48352},{"gate":"LOCALISER","value":22},{"gate":1,"value":34351},{"gate":2,"value":37855},{"gate":3,"value":38462},{"gate":4,"value":38126},{"gate":5,"value":40089},{"gate":6,"value":39295},{"gate":7,"value":36581},{"gate":8,"value":33908},{"gate":9,"value":31187},{"gate":10,"value":22915},{"gate":11,"value":5164},{"gate":12,"value":9533},{"gate":13,"value":6454},{"gate":14,"value":5003},{"gate":15,"value":1},{"gate":21,"value":19804},{"gate":22,"value":21239},{"gate":23,"value":17779},{"gate":24,"value":15213},{"gate":"-","value":37562}]; 
var gatePosResult = []; 

for(var i = 0; i < gatePos.length; i++) { 
    gatePosResult[i] = {}; 
    for(var key in gatePos[i]) { 
     if(gatePos[i].hasOwnProperty(key)) { 
      gatePosResult[i][key] = gatePos[i][key]; 
     } 
    }  
    gatePosResult[i].value = null; 
    for(var j = 0; j < gatePosValue.length; j++) { 
     if(gatePosValue[j].gate === gatePosResult[i].gate) { 
      gatePosResult[i].value = gatePosValue[j].value; 
      break; 
     } 
    } 
} 
console.log(gatePosResult); 
1

Vous pouvez utiliser resuce et find comme:

let result = gatePos.reduce(function(res, obj) {  // for each object obj in gatePos array 
    var found = otherArray.find(function(o) {  // check if there is an object in the other array (rename the variable name before use) 
     return o.gate == obj.gate;     // that has the same gate as the object obj 
    }); 
    if(found) {          // if we found one 
     var newObj = Object.assign({}, obj);   // then create a new object 
     newObj.value = found.value;     // set its value 
     res.push(newObj);       // and add it to the result array 
    } 
    return res; 
}, []); 

Note: Je Référé à la deuxième série de votre question otherArray. Renommez le nom de la variable pour correspondre à la variable réelle utilisée pour contenir ce tableau.