#javascript #arrays #string #loops #concatenation
#javascript #массивы #строка #петли #объединение
Вопрос:
Учитывая этот массив: arr = [ ‘00011100’, ‘00000001’, ‘00101101’, ‘11111111’ ];
Если элемент находится на четной позиции в массиве, я должен удалить все символы с четным индексом из этого элемента и наоборот. Пример:
Первый элемент находится в четном положении: arr[0] = ‘0 0 0 1 1 1 0 0‘
Второй элемент находится в нечетной позиции: arr[1] = ‘0 0 0 0 0 0 0 1′;
Я должен удалить эти символы и вернуть их как объединенную строку.
Вывод всего массива // 0110 0000 0011 1111
Пожалуйста, помогите мне решить эту задачу 🙂 Заранее благодарю вас!
let enigma = "";
for(let i = 0; i < arr.length; i ){
let index = arr[i];
let evenStr = "";
let oddStr = "";
if(index % 2 === 0) {
for(let j = 1; j < index.length; j =2) {
evenStr = index[j];
} enigma = evenStr;
} else if(index % 2 !== 0) {
for(let x = 1; x < index.length; x =2) {
oddStr = index[x];
} enigma = oddStr;
}
}
console.log(enigma) //0110000100111111;
Пока это мой код, но результат, который я получаю, немного отличается :/
Комментарии:
1. с какими проблемами вы сталкиваетесь с тем, что вы пробовали?
2.
arr[0] = '00011100'
. Используетеzero-based
ли вы индекс массива для вычисления того, что находится в четном положении, а что в нечетном.3. Как вы вычисляете
even
orodd
в'00011100'
4. ДА. Первый элемент из массива находится в четном положении. —> arr[0];
5. И следующий элемент находится в нечетной позиции -> arr [1];
Ответ №1:
Вот потенциальное решение вашей проблемы.
Использование reduce()
const removeOddIndex = ( str ) => {
return str.split("").filter( ( element, index ) => index % 2).join("");
}
const removeEvenIndex = ( str ) => {
return str.split("").filter( ( element, index ) => !( index % 2 )).join("");
}
const array = [ '00011100', '00000001', '00101101', '11111111' ];
const result = array.reduce( ( acc, cur, index ) => {
if( index % 2 ) {
acc[index] = removeEvenIndex( cur );
} else {
acc[index] = removeOddIndex( cur );
}
return acc;
}, array).join("")
console.log(result)
Использование map()
const removeOddIndex = ( str ) => {
return str.split("").filter( ( element, index ) => index % 2).join("");
}
const removeEvenIndex = ( str ) => {
return str.split("").filter( ( element, index ) => !( index % 2 )).join("");
}
const array = [ '00011100', '00000001', '00101101', '11111111' ];
const result = array.map( ( element, index ) => {
return index % 2 ? removeEvenIndex( element ) : removeOddIndex( element )
} ).join("");
console.log(result)
Комментарии:
1. Ответ возвращает многомерный массив. У вас есть какие-либо идеи, как я могу получить конечный результат в виде объединенной строки «0110000000111111». Я
reduce()
еще не знаком.2. Я отредактировал свое решение, чтобы дать вам ожидаемый результат
Ответ №2:
Вы можете легко добиться этого, используя сопоставление, разделение и объединение
const arr = ["00011100", "00000001", "00101101", "11111111"];
const getEven = (value) =>
value
.split("")
.filter((el, i) => i % 2 === 0)
.join("");
const getOdd = (value) =>
value
.split("")
.filter((el, i) => i % 2 === 1)
.join("");
const result = arr
.map((val, index) => {
if (index % 2 === 0) return getOdd(val);
else return getEven(val);
})
.join("");
console.log( result );
Ответ №3:
Вы можете выполнить фильтрацию, взяв оставшуюся часть элемента внешнего элемента и значения элемента.
const
array = ['00011100', '00000001', '00101101', '11111111'],
result = array.map(([...a], i) => a.filter((v, j) => i % 2 !== j % 2).join(''));
console.log(result);