Cela semble être un important usage général en question, et bien qu'il existe beaucoup de réponses, certains ont un comportement borderline comme la modification de données existantes, de résoudre complètement le problème est différent de la question à portée de main, à l'aide de jusqu'à 93,057 octets de JavaScript (pour ne pas mentionner produire le mauvais résultat), la production de trop complexe supplémentaire à l'imbrication de structures de données, nécessitant beaucoup de code à chaque invocation, et plus sérieusement, n'étant pas une solution autonome pour la important à des fins plus générales problème au cœur de cette question.
Donc, pour le meilleur ou pour le pire, j'ai écrit une cale qui s'étend le JavaScript Array
objet avec une méthode .joinWith
destiné à être utilisé dans le but de rejoindre this
tableau d'objets avec that
tableau d'objets, by
d'une indexation commune de champ. Il est possible d' select
une liste de champs désiré en sortie (bon pour la fusion des tableaux d'objets avec de nombreux champs lorsque seuls quelques-uns sont voulu) ou d' omit
d'une liste de champs en sortie (bon pour la fusion des tableaux d'objets lorsque la plupart des champs sont souhaitées, mais quelques-uns ne le sont pas).
La cale code n'est pas fait pour faire joli, de sorte qu'il sera à la fin, avec l'exemple de la façon de l'utiliser pour l'OP du type particulier de données d'entrée en première:
/* this line will produce the array of objects as desired by the OP */
joined_objects_array = userProfiles.joinWith(questions, 'id', ['createdBy'], 'omit');
/* edit: I just want to make 100% sure that this solution works for you, i.e.,
* does exactly what you need. I haven't seen your actual data, so it's
* possible that your IDs are are not in common, (i.e., your createdBy
* is in common like you said, but not the IDs, and if so you could
* morph your data first like this:
* questions.map(function(x) { x.id = x.createdBy; });
* before joining the arrays of objects together.
*
*/
Le code suivant est à des fins de démonstration:
var array1 = [{ id: 3124, name: 'Mr. Smith' },
{ id: 710, name: 'Mrs. Jones' }];
var array2 = [{ id: 3124, text: 'wow', createdBy: 'Mr. Jones' },
{ id: 710, text: 'amazing' }];
var results_all = array1.joinWith(array2, 'id');
// [{id:3124, name:"Mr. Smith", text:"wow", createdBy:"Mr. Jones"},
// {id:710, name:"Mrs. Jones", text:"amazing"}]*
var results_selected = array1.joinWith(array2, 'id', ['id', 'text', 'name']);
// [{id:3124, name:"Mr. Smith", text:"wow"},
// {id:710, name:"Mrs. Jones", text:"amazing"}]*
/* or equivalently, */
var results_omitted = array1.joinWith(array2, 'id', ['createdBy'], 1);
// [{id:3124, name:"Mr. Smith", text:"wow"},
// {id:710, name:"Mrs. Jones", text:"amazing"}]*
Il y a quelques autres belles choses cette solution n' (l'un d'eux est de préserver la capacité d'accéder aux données obtenues par sa clé d'indexation, en dépit de renvoyer un tableau).
Profitez-en!
/* Array.joinWith - shim by Joseph Myers 7/6/2013 */
if (!Array.prototype.joinWith) {
+function () {
Array.prototype.joinWith = function(that, by, select, omit) {
var together = [], length = 0;
if (select) select.map(function(x){select[x] = 1;});
function fields(it) {
var f = {}, k;
for (k in it) {
if (!select) { f[k] = 1; continue; }
if (omit ? !select[k] : select[k]) f[k] = 1;
}
return f;
}
function add(it) {
var pkey = '.'+it[by], pobj = {};
if (!together[pkey]) together[pkey] = pobj,
together[length++] = pobj;
pobj = together[pkey];
for (var k in fields(it))
pobj[k] = it[k];
}
this.map(add);
that.map(add);
return together;
}
}();
}
Documentation:
/* this and that both refer to an array of objects, each containing
object[by] as one of their fields */
/*
N.B. It is the responsibility of the user of this method
to ensure that the contents of the [by] fields are
consistent with each other between the two arrays!
*/
/* select is an array of field names to be included in the resulting
objects--all other fields will be excluded, or, if the Boolean value
of omit evaluates to true, then select is an array of field names to
be excluded from the resulting objects--all others will be included.
*/