Я хотел бы передать значения ключей объектам в массиве1 из других объектов массива2
Для этого нужно найти соответствующие значения в обоих массивах, а затем нажать правую клавишу.
let array1 = [
{
"Ref": "28189-060-B",
"Otherkey": "Whatever"
},
{
"Ref": "18182-250-B",
"Otherkey": "Whatever2"
},
{
"Ref": "55187-753-B",
"Otherkey": "Whatever3"
}
]
let array2 = [
{
"Ref": "28189-060-ABCD",
"Style": "Red"
},
{
"Ref": "18182-250-ABCD",
"Style": "Blue"
},
{
"Ref": "55187-753-ABCD",
"Style": "Yellow"
}
]
Функция должна перебрать все объекты в массиве1, просмотреть первые 9 символов значений Ref, найти совпадение в массиве2 Ref (только первые 9 символов идентичны). Когда есть совпадение, нажмите «Стиль» из массива2 в соответствующий объект в массиве1.
Я пытался с Object.key.foreach(), map(), с substr получить только 9 символов, с find()... все это было большим беспорядком и не работало...
Ожидаемый результат :
let array1 = [
{
"Ref": "18182-250-B",
"Otherkey": "Whatever2",
"Style": "Blue"
},
{
"Ref": "28189-060-B",
"Otherkey": "Whatever",
"Style": "Red"
},
{
"Ref": "55187-753-B",
"Otherkey": "Whatever3",
"Style": "Yellow"
}
]
Я изменил Global_Stylecode на ref, чтобы было менее запутанно :)
var arrMap = {};
array1.forEach(function(x){
if (!arrMap[x.Ref.substring(0,9)]){
arrMap[x.Ref.substring(0,9)] = x;
}
});
array2.forEach(function(x){
if (Object.keys(arrMap).includes(x.Ref.substring(0,9))){
arrMap[x.Ref.substring(0,9)] = Object.assign(arrMap[x.Ref.substring(0,9)], {"Style": x.Style});
}
});
console.info(Object.values(arrMap));
Спасибо за ваш ответ !
Что-то вроде этого может быть тем, что вы хотите:
array1.forEach(function (element1) {
array2.forEach(function (element2){
addStyle(element1, element2);
});
});
function addStyle(obj1, obj2){
if (obj1.Ref && obj2.Ref){
let Ref1 = obj1.Ref.substr(0,8);
let Ref2 = obj2.Ref.substr(0, 8);
if (Ref1 === Ref2){
obj1.Style = obj2.Style;
};
}
}
Таким образом, мы перебираем первый массив и для каждого элемента перебираем второй массив.
Затем мы проверяем, присутствуют ли ожидаемые поля, и если да, то сравниваем их. Если они совпадают, мы добавляем поле «Стиль» и переходим к следующему объекту.
Спасибо за ваш ответ !
Приведенный ниже код будет работать, хотя мы могли бы оптимизировать его дальше.
var newArr = []
for(let k in array1){
for(let i in array2){
console.info(array2[i]['Ref'].substr(0,9))
if (array1[k]['Ref'].substr(0,9) == array2[i]['Ref'].substr(0,9)){
let temp = array1[k]
temp['Style'] = array2[i]['Style']
newArr.push(temp)
}
}
}
Спасибо за ваш ответ !
Первое решение немного сложное.
Вероятно, у вас опечатка в array1
, так как ваш первый ключ не согласован. вместо Global_Stylecode
вы, вероятно, имели в виду Ref
, В любом случае, скорее всего, у него должен быть такой же ключ. Если предположить, что ключ Ref, то
array1.forEach( ({Ref: Ref1, Otherkey}, index) => {
const Ref1Sub = Ref1.substring(0, 9);
array2.forEach(({Ref: Ref2, Style}) => {
if (Ref2.includes(Ref1Sub)) {
array1[index].Style = Style;
}
})
});
Также нет необходимости определять массивы как let
. const
будет хорошо.
Спасибо за ваш ответ !
Предполагая, что все эти свойства должны быть Ref
(некоторые Global_Style
), вы можете использовать forEach
и find
:
let array1 = [{"Ref":"28189-060-B","Otherkey":"Whatever"},{"Ref":"18182-250-B","Otherkey":"Whatever2"},{"Ref":"55187-753-B","Otherkey":"Whatever3"}];
let array2 = [{"Ref":"28189-060-ABCD","Style":"Red"},{"Ref":"18182-250-ABCD","Style":"Blue"},{"Ref":"55187-753-ABCD","Style":"Yellow"}];
const shorterRef = (ref) => ref.substr(0, 9);
array1.forEach(obj => {
const a1Ref = shorterRef(obj.Ref);
const arr2Obj = array2.find(tmp => shorterRef(tmp.Ref) === a1Ref);
if (arr2Obj) obj.Style = arr2Obj.Style;
});
console.info(array1);
Если вы не хотите изменять массив, используйте map
:
let array1 = [{"Ref":"28189-060-B","Otherkey":"Whatever"},{"Ref":"18182-250-B","Otherkey":"Whatever2"},{"Ref":"55187-753-B","Otherkey":"Whatever3"}];
let array2 = [{"Ref":"28189-060-ABCD","Style":"Red"},{"Ref":"18182-250-ABCD","Style":"Blue"},{"Ref":"55187-753-ABCD","Style":"Yellow"}];
const shorterRef = (ref) => ref.substr(0, 9);
const out = array1.map(obj => {
const a1Ref = shorterRef(obj.Ref);
const arr2Obj = array2.find(tmp => shorterRef(tmp.Ref) === a1Ref);
if (arr2Obj) return { ...obj, Style: arr2Obj.Style };
});
console.info(out);
Вау, это ужин, интересно узнать, как это работает, мне понравился ваш ответ, потому что он понятен для новичка, и я узнаю отличные вещи, большое спасибо!
Должны ли вы сопоставлять
Global_Stylecode
, если в первом массиве нет свойстваRef
?