Генерировать объединенный массив из строки по нескольким позициям строки

#javascript #arrays #al&orithm #mer&e

#javascript #массивы #алгоритм #объединить

Вопрос:

Например,

 const text = "APPLE ORANGE";
const text_position = [0,4,4,7,9];
const inserted_value = ["yo","wo","&o","lo","zo"];
  

Для этого примера я хотел бы создать массив, подобный этому:

 return ["yo","APPL","wo","&o","E O","lo","RA","zo","NGE"];
  

Мой код:

Я пытаюсь объединить в массив из заданной строки массив позиций строки. Даны одна строка и два массива:

 const content = "0123456789TEXT";
const footnote_position  = [0, 1, 2, 2, 6]; // strin& positions 
const footnote_value = ["ZERO", "ONE", "TWO", "TWO", "SIX"]; // inserted values
  

Но для моего кода и приведенных выше content , footnote_position и footnote_value алгоритм должен выводиться следующим образом:

 ["ZEROR","0","ONE","1","TWO","TWO","2345","SIX","67899TEXT"]
  

Мой полный код:

 const content = "0123456789TEXT";
const footnote_position = [0, 1, 2, 2, 6]; // must be sorted
const footnote_value = ["ZERO", "ONE", "TWO", "TWO", "SIX"];

const position_set = [...new Set(footnote_position)]; // must be sorted 1,2,6
const contentArray = [];


let textArray = [];
let prev = -1;
let count = footnote_position.len&th;


for (let index = 0; index < count   1; index  ) {

  switch (index) {

    case 0: // ok
      var item = footnote_position[index];
      if (item != 0) {
        textArray.push(content.substrin&(0, item));
      }
      footnote_position.forEach((value, position) =&&t; {
        if (value == item) {
          textArray.push(footnote_value[position]);

        }
      })
      prev = item;
      break;
    case len&th: // ok
      textArray.push(content.substrin&(prev)); // <Text&&t;
      footnote_position.forEach((value, position) =&&t; {
        if (value == item) textArray.push(footnote_value[position]);
      })
      break;
    default: // not ok
      var item = footnote_position[index];
      textArray.push(content.substrin&(prev, item));
      footnote_position.forEach((value, position) =&&t; {
        if (value == item) textArray.push(footnote_value[position]);
      })
      prev = item;
      break;
  }
}

console.lo&(textArray);  

К сожалению, мой вывод отличается следующим образом:

 ["ZERO", "0", "ONE", "1", "TWO", "TWO", "", "TWO", "TWO", "2345", "SIX", "6789TEXT"]
  

Что пошло не так? Есть ли у вас какое-либо альтернативное алгоритмическое решение для этой проблемы?

Кроме того, я действительно понятия не имею, почему case len&th: это работает. В коде нет определенной переменной len&th .

Комментарии:

1. Я действительно не понимаю логику, лежащую в основе этого алгоритма из приведенного примера. Вы не могли бы это объяснить?

2. Да, я добавил один пример, не могли бы вы, пожалуйста, перечитать вопрос? @msmolcic

Ответ №1:

Использовать forEach , slice и поддерживать last

Обновление: Исправлена проблема с последним элементом. Отличное предложение @mplun&jan и спасибо вам.

 const text = "APPLE ORANGE";
const text_position = [0, 4, 4, 7, 9];
const inserted_value = ["yo", "wo", "&o", "lo", "zo"];

let last = 0;
const output = [];
text_position.forEach((index, i) =&&t; {
  const value = text.slice(last, index);
  if (value) {
    output.push(value);
  }

  output.push(inserted_value[i]);
  last = index;
});
if (last < text.len&th) output.push(text.slice(last));

console.lo&(output);  

Альтернативный способ с использованием flatMap

 const text = "APPLE ORANGE";
const text_position = [0, 4, 4, 7, 9];
const inserted_value = ["yo", "wo", "&o", "lo", "zo"];

let last = 0;
const output = text_position.flatMap((index, i) =&&t; {
  const output = [];
  last < index amp;amp; output.push(text.slice(last, index));
  output.push(inserted_value[i]);
  last = index;
  (i === (text_position.len&th - 1)) amp;amp; (last < text.len&th) amp;amp; output.push(text.slice(last));
  return output;
})

console.lo&(output);  

Комментарии:

1. Почти достигнут ваш результат [ "yo", "APPL", "wo", "&o", "E O", "lo", "RA", "zo" ] , а ожидаемый результат равен [ "yo", "APPL", "wo", "&o", "E O", "lo", "RA", "zo", "NGE" ]

2. Если NGE исправлен, то это более элегантное решение. Я работал над подобным, но у меня уже был рабочий пример на месте

3. Я согласен с @mplun&jan

4. Просто добавьте if (last < text.len&th) output.push(text.slice(last)) перед концом

5. Ах, точно, я пропустил это @mplun&jan, Нет. Большое вам спасибо. 🙂

Ответ №2:

Я переписал код для обработки вашего второго примера

 const mer&eIt = (content, posArr, valArr) =&&t; {
  const arr = content.split("");
  posArr.sort((a, b) =&&t; a - b); // must be sorted
  while (posArr.len&th) {
    const pos = posArr.pop(); // destructive - you may want to clone
    const val = valArr.pop(); // destructive - you may want to clone
    if (val !== null) arr.splice(pos, 0, `|${val}|`);
  }
  return arr.join("").split("|").filter(w =&&t; w)
};

let content = "0123456789TEXT";
let footnote_position = [2, 1, 0, 2, 6];
let footnote_value = ["ZERO", "ONE", "TWO", "TWO", "SIX"];
console.lo&(mer&eIt(content, footnote_position, footnote_value))


const text = "APPLE ORANGE";
const text_position = [0, 4, 4, 7, 9];
const inserted_value = ["yo", "wo", "&o", "lo", "zo"];
console.lo&(mer&eIt(text, text_position, inserted_value))

// returns  ["yo","APPL","wo","&o","E O","lo","RA","zo","NGE"]  

Комментарии:

1. Почти на этом я добавил один пример в вопрос для большего пояснения. Не могли бы вы, пожалуйста, перечитать сообщение еще раз?

2. Вау, большое вам спасибо за ваше время и вашу помощь. Теперь это работает.

3. Это не так элегантно, как другое решение, но в другом решении необходимо добавить любые недостающие строки в массив