Как сопоставить два массива строк друг с другом?

#javascript #arrays #string

#javascript #массивы #строка

Вопрос:

У меня есть два массива:

Массив # 1:

 let training = [
  "Z1,1545 John Doe,P1",
  "Z2,2415 Shane Yu,P2"
];
 

Массив # 2:

 let skill = [
  "P1, Shooting",
  "P2, Passing",
];
 

Оба массива должны быть объединены вместе в соответствии с их P номером и удалены P из обучающего массива.

Желаемый результат:

 [ 
  'Z1,1545 John Doe, P1, Shooting',
  'Z2,2415 Shane Yu, P2, Passing'
]
 

Есть ли способ сделать это в ES6?

Ответ №1:

Вы можете создать карту ES6 из своего skill массива, чтобы каждый P<number> указывал на навык. Затем вы можете использовать .map() и .replace() в своем training массиве, чтобы получить желаемый результат:

 const training = [ "Z1,1545 John Doe,P1", "Z2,2415 Shane Yu,P2" ];
const skill = [ "P1, Shooting", "P2, Passing", ];

const lookup = new Map(skill.map(item => [item.split(", ").shift(), item]));
const result = training.map(str => str.replace(/Pd /, m => lookup.get(m)));
console.log(result); 

Вы также можете пропустить создание карты и выполнить линейный поиск с .find() помощью и .startsWith() в методе replace . Это менее эффективно, хотя, если skills у него много навыков (например: это O (NK) против O (N K) выше):

 const training = [ "Z1,1545 John Doe,P1", "Z2,2415 Shane Yu,P2" ];
const skills = [ "P1, Shooting", "P2, Passing"];

const result = training.map(str => str.replace(/Pd /, m => skills.find(
  skill => skill.startsWith(m)
)));
console.log(result); 

Ответ №2:

Кажется, что массив навыков может быть преобразован в объект карты:

 let skillMap = new Map(skill.map(e=>e.split(“,”)))

// split(“,”) convert "P1, Shooting" into [“P1”,” Shooting”]
// skill.map return a new array with the converted elementos
// The Map object is created which each pair as key and value
 

Затем вы можете выполнить итерацию обучающего массива, выбрав из skillMap описание каждого навыка. вы можете сделать это разными способами, но мой первый дубль будет:

 let output = training.map(e=>e.split(“,”)).map(e=>[e[0],e[1],e[2] skillMap.get(e[2])]
 

Ответ №3:

Немного другой подход:

 let training = [
    "Z1,1545 John Doe,P1",
    "Z2,2415 Shane Yu,P2"
];

let skill = [
    "P1, Shooting",
    "P2, Passing",
];

let merged = training.map((prefix) => {
  const [, , pIndex] = prefix.split(',');
  const suffix = skill.find((skillStr) => skillStr.startsWith(pIndex));
  
  return `${prefix}${suffix.slice(2)}`;
});

console.log(merged)