В моем проекте AngularJS 1.3 я пытаюсь объединить объекты с заданными ключами и объединить их.Рассмотрим приведенный ниже объект (для лучшего понимания рассмотрим ключи как столбцы таблицы):
var json = {
"filteredTask": [{
"Email_1202_1_1554368387884": "c@c",
"Number_1202_2_1554368395451": "50000",
"Number_1202_3_1554368408148": "30000",
"Text_Field_1202_4_1554368416611": "Developer"
}, {
"Email_1202_1_1554368387884": "b@b",
"Number_1202_2_1554368395451": "25000",
"Number_1202_3_1554368408148": "20000",
"Text_Field_1202_4_1554368416611": "QA"
}, {
"Email_1202_1_1554368387884": "a@a",
"Number_1202_2_1554368395451": "22000",
"Number_1202_3_1554368408148": "20000",
"Text_Field_1202_4_1554368416611": "Developer"
}, {
"Text_Field_1202_1_1554367796776": "c@c",
"Text_Field_1202_2_1554367980023": "Admin",
"Text_Field_1202_3_1554367980751": "HR"
}, {
"Text_Field_1202_1_1554367796776": "b@b",
"Text_Field_1202_2_1554367980023": "Non Technical",
"Text_Field_1202_3_1554367980751": "QA"
}, {
"Text_Field_1202_1_1554367796776": "a@a",
"Text_Field_1202_2_1554367980023": "Technical",
"Text_Field_1202_3_1554367980751": "Developer"
}],
"filter": {
"joinField": [{
"formField": {
"new_key": "Text_Field_1202_1_1554367796776"
},
"withFormField": {
"new_key": "Email_1202_1_1554368387884"
}
}, {
"formField": {
"new_key": "Text_Field_1202_3_1554367980751"
},
"withFormField": {
"new_key": "Text_Field_1202_4_1554368416611"
}
}]
}
};
Обратите внимание, filteredTask
содержит все данные, а filter
содержит информацию ключа присоединяемого поля.
Теперь я хочу выполнить соединение так же, как SQL на JSON.Например, присоединитесь к двум ключам Text_Field_1202_1_1554367796776
и Email_1202_1_1554368387884
(соответствие электронной почты, например, a @ a, b @ b & c @ c), результат должен быть таким же, как показано ниже.
[{
"Email_1202_1_1554368387884": "c@c",
"Number_1202_2_1554368395451": "50000",
"Number_1202_3_1554368408148": "30000",
"Text_Field_1202_4_1554368416611": "Developer",
"Text_Field_1202_1_1554367796776": "c@c",
"Text_Field_1202_2_1554367980023": "Admin",
"Text_Field_1202_3_1554367980751": "HR"
}, {
"Email_1202_1_1554368387884": "b@b",
"Number_1202_2_1554368395451": "25000",
"Number_1202_3_1554368408148": "20000",
"Text_Field_1202_4_1554368416611": "QA",
"Text_Field_1202_1_1554367796776": "b@b",
"Text_Field_1202_2_1554367980023": "Non Technical",
"Text_Field_1202_3_1554367980751": "QA"
}, {
"Email_1202_1_1554368387884": "a@a",
"Number_1202_2_1554368395451": "22000",
"Number_1202_3_1554368408148": "20000",
"Text_Field_1202_4_1554368416611": "Developer",
"Text_Field_1202_1_1554367796776": "a@a",
"Text_Field_1202_2_1554367980023": "Technical",
"Text_Field_1202_3_1554367980751": "Developer"
}]
Теперь,если я выполняю два соединения, например Text_Field_1202_1_1554367796776
с Email_1202_1_1554368387884
(электронная почта) и Text_Field_1202_3_1554367980751
с Text_Field_1202_4_1554368416611
(обозначение), то результат должен быть примерно таким, как показано ниже, с учетом совпадения электронной почты и обозначения:
[{
"Email_1202_1_1554368387884": "b@b",
"Number_1202_2_1554368395451": "25000",
"Number_1202_3_1554368408148": "20000",
"Text_Field_1202_4_1554368416611": "QA",
"Text_Field_1202_1_1554367796776": "b@b",
"Text_Field_1202_2_1554367980023": "Non Technical",
"Text_Field_1202_3_1554367980751": "QA"
}, {
"Email_1202_1_1554368387884": "a@a",
"Number_1202_2_1554368395451": "22000",
"Number_1202_3_1554368408148": "20000",
"Text_Field_1202_4_1554368416611": "Developer",
"Text_Field_1202_1_1554367796776": "a@a",
"Text_Field_1202_2_1554367980023": "Technical",
"Text_Field_1202_3_1554367980751": "Developer"
}]
Я пробовал утилиты lodash library для этого.
angular.forEach(json.filter.joinField, function (jField) {
var obj1 = _.filter(json.filteredTask, function (o1) {
return o1[jField.formField.new_key];
});
var obj2 = _.filter(json.filteredTask, function (o2) {
return o2[jField.withFormField.new_key];
});
// for intersaction data
var result = _.intersectionWith(_.cloneDeep(obj1), obj2, function (x, y) {
//Improvement needed here: when I print, it shows different keys and values and generated output differently.
return x[jField.formField.new_key] === y[jField.withFormField.new_key] && _.assign(x, y);
});
json.filteredTask = result;
});
console.log(json);
Дайте мне знать, можем ли мы достичь этого любым другим способом или этот можно улучшить.