Проверьте соответствие ключа в массиве, если найдено, возьмите 2-е записи массива, если не принимать 1-е записи массива в javascript

#javascript #arrays #json

#javascript #массивы #json

Вопрос:

У меня есть 2 объекта массива

1.

 itemMapping = {
    id:1,
    hierarchyDesc:"Men's casual",
    style:"Denim Pants",
    styleDesc:"VS pants",
    color:"blue"
}
 
 mapData = {
    hierarchyDesc:"Women's casual",
    style:"Cotton Pants",
    styleDesc:"pants"
}
 

Мне нужно сравнить ключ каждого itemMapping с ключом каждого MapData и сформировать новый массив, если какой-
либо из ключей совпадает (например: здесь в itemMapping и MapData — hierarchyDesc, style, styleDesc есть в обоих), затем возьмите эти соответствующие записи объектов из массива MapData и нажмите на newArray,
еслион не соответствует и находится только в массиве отображения элементов, затем возьмите эти не совпадающие записи объектов из массива отображения элементов и нажмите на newArray.

Примечание: весь ключ объекта MapData будет присутствовать в itemMapping, но наоборот неверно.

ожидаемый результат:

 newArray = {
    id:1,
    hierarchyDesc:"Women's casual",
    style:"Cotton Pants",
    styleDesc:"pants",
    color:"blue"
}
 

как я могу добиться этого в Javascript?

Ответ №1:

Вы можете использовать оператор распространения ES6 const res = {...itemMapping, ...mapData }

Смотрите ниже

 const itemMapping = { id:1, hierarchyDesc:"Men's casual", style:"Denim Pants", styleDesc:"VS pants", color:"blue" },
mapData = { hierarchyDesc:"Women's casual", style:"Cotton Pants", styleDesc:"pants" };
const res = {...itemMapping, ...mapData  }
console.log(res); 

Ответ №2:

Вы можете использовать map над ключами itemMapping объекта и использовать Object.fromEntries для преобразования массива пар ключ-значение в объект.

 const itemMapping = { id:1, hierarchyDesc:"Men's casual", style:"Denim Pants", styleDesc:"VS pants", color:"blue" },
mapData = { hierarchyDesc:"Women's casual", style:"Cotton Pants", styleDesc:"pants" };
const res = Object.fromEntries(Object.keys(itemMapping)
    .map(k => [k, k in mapData ? mapData[k] : itemMapping[k]]));
console.log(res); 

Ответ №3:

Вы могли бы попробовать что-то подобное этому.

 const newValues = {};
for (const item in itemMapping) {
    if(mapData[item]){
        newValues[item] = mapData[item]
    } else {
        newValues[item] = itemMapping[item]
    }
}
 

Требуемые значения ключа добавляются в объект newValues (не в массив)

Ответ №4:

Альтернативой вышеуказанному подходу является использование уменьшения массива для ключей itemMapping . Обратите внимание, что я бы также рассмотрел переименование newArray во что-то другое, поскольку это объект, а не массив.

 const itemMapping = {
  id: 1,
  hierarchyDesc: "Men's casual",
  style: "Denim Pants",
  styleDesc: "VS pants",
  color: "blue"
};

const mapData = {
  hierarchyDesc: "Women's casual",
  style: "Cotton Pants",
  styleDesc: "pants"
};

const newArray = Object.keys(itemMapping).reduce((acc, key) => {
  acc[key] = key in mapData ? mapData[key] : itemMapping[key];
  return acc;
}, {});

console.log(newArray)