Как мне решить этот конкретный алгоритм в JavaScript?

#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 or odd в '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);