#javascript #arrays #node.js #object
#javascript #массивы #node.js #объект
Вопрос:
Я хотел бы передать значения ключа объектам в array1 из других объектов array2
Для этого необходимо выполнить поиск соответствующих значений в обоих массивах, затем нажать нужную клавишу.
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 символов значений ссылок, найти совпадение в массиве 2 Ref (только первые 9 символов идентичны). При совпадении вставьте «Стиль» из array2 в соответствующий объект в array1
Я пытался с 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"
}
]
Комментарии:
1. Следует ли вам сопоставлять,
Global_Stylecode
если в первом массиве нетRef
свойства?2. Я изменил Global_Stylecode на ref, чтобы быть менее запутанным 🙂
Ответ №1:
Предполагая, что все эти свойства должны быть 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.log(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.log(out);
Комментарии:
1. Вау, это очень интересно узнать об этой работе, мне понравился ваш ответ, потому что он понятен для новичка, и я узнаю отличные вещи, большое спасибо!
Ответ №2:
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.log(Object.values(arrMap));
Комментарии:
1. Спасибо за ваш ответ!
Ответ №3:
Что-то вроде этого может быть тем, что вы хотите:
array1.forEach(function (element1) {
array2.forEach(function (element2){
addStyle(element1, element2);
});
});
function addStyle(obj1, obj2){
if (obj1.Ref amp;amp; obj2.Ref){
let Ref1 = obj1.Ref.substr(0,8);
let Ref2 = obj2.Ref.substr(0, 8);
if (Ref1 === Ref2){
obj1.Style = obj2.Style;
};
}
}
Итак, мы перебираем первый массив и для каждого элемента перебираем второй массив.
Затем мы проверяем, присутствуют ли ожидаемые поля, и если да, то сравниваем их. Если они совпадают, мы добавляем поле «Стиль» и переходим к следующему объекту
Комментарии:
1. Спасибо за ваш ответ!
Ответ №4:
Приведенный ниже код будет работать, хотя мы могли бы оптимизировать его дальше.
var newArr = []
for(let k in array1){
for(let i in array2){
console.log(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)
}
}
}
Комментарии:
1. Спасибо за ваш ответ!
Ответ №5:
Первое решение немного сложное. Вероятно, у вас опечатка в 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
все будет в порядке.
Комментарии:
1. Спасибо за ваш ответ!