#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. Это не так элегантно, как другое решение, но в другом решении необходимо добавить любые недостающие строки в массив