У меня есть два массива, как показано ниже:

const array1 = [
  { type: 'BA', value: 100 },
  { type: 'CA', value: 200 },
];
const array2 = [
  {
    NameBA: 'STANDARD',
    NameDescriptionBA: 'STANDARD',
    AgeBA: 0,
    NameCA: 'STANDARD',
    NameDescriptionCA: 'STANDARD',
    AgeCA: 0,
  },
]

Array1 имеет значение типа «BA», мне нужно найти ключи array2, в которые последние 2 символа входят со значением типа array1 «BA», и объединить их со связанным объектом array1.

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

cosnt array1 = [
  { 
    type: 'BA', 
    value: 100,
    NameBA: 'STANDARD',
    NameDescriptionBA: 'STANDARD',
    AgeBA: 0,
  },
  { 
    type: 'CA',
    value: 200,
    NameCA: 'STANDARD',
    NameDescriptionCA: 'STANDARD',
    AgeCA: 0,
  },
]

Я попробовал описанный ниже метод, но результат неверный.

const keys = Object.keys(array2[0]);
array1.map(a => {
  keys.map(b => {
    if (b.includes(a.type)) {
      array2.map(c => {
        a.b = c.b
      })
    }
  });
});
2
imjayabal 22 Сен 2021 в 14:55

2 ответа

Лучший ответ

Вы используете только один объект из второго массива, поэтому, просто заменив это определение на объект, вы можете преобразовать объект в пары ключ / значение и filter() их вниз, чтобы они соответствовали type:

const array = [
  { type: 'BA', value: 100 },
  { type: 'CA', value: 200 },
];

const object = {
  NameBA: 'STANDARD',
  NameDescriptionBA: 'STANDARD',
  AgeBA: 0,
  NameCA: 'STANDARD',
  NameDescriptionCA: 'STANDARD',
  AgeCA: 0,
};

const result = array.map(({type, value}) => ({
  type,
  value,
  ...Object.fromEntries(
    Object.entries(object).filter(([k, v]) => k.endsWith(type))
  )
}));

console.log(result);

Если ваш второй массив действительно является массивом с несколькими объектами, просто добавьте flatMap(), чтобы сгладить все записи объектов:

const array1 = [
  { type: 'BA', value: 100 },
  { type: 'CA', value: 200 },
];

const array2 = [{
  NameBA: 'STANDARD',
  NameDescriptionBA: 'STANDARD',
  AgeBA: 0,
  NameCA: 'STANDARD',
  NameDescriptionCA: 'STANDARD',
  AgeCA: 0,
}];

const result = array1.map(({type, value}) => ({
  type,
  value,
  ...Object.fromEntries(
    array2.flatMap(Object.entries).filter(([k, v]) => k.endsWith(type))
  )
}));

console.log(result);
3
Robby Cornelissen 22 Сен 2021 в 12:18

Вы можете сделать что-то подобное.

const array1 = [
  { type: 'BA', value: 100 },
  { type: 'CA', value: 200 },
];
const array2 = [
  {
    NameBA: 'STANDARD',
    NameDescriptionBA: 'STANDARD',
    AgeBA: 0,
    NameCA: 'STANDARD',
    NameDescriptionCA: 'STANDARD',
    AgeCA: 0,
  },
]

const keys = Object.keys(array2[0]);
const result = array1.map(a => {
  let currentObject = {}
  keys.map(b => {
    if (b.indexOf(a.type) !== -1) {
      currentObject = {
         ...currentObject,
         ...a, 
         [b]: array2[0][b]
      }
    }
  });
  return currentObject;
});

console.log(result)
2
Mehul Thakkar 22 Сен 2021 в 12:08