JavaScript: как использовать отдельные переменные индекса массива для ключей и значений объекта? - PullRequest
0 голосов
/ 03 июля 2018

Описание задачи Создайте функцию objOfMatches, которая принимает два массива и обратный вызов. objOfMatches создаст объект и вернет его. Чтобы построить объект, objOfMatches протестирует каждый элемент первого массива, используя обратный вызов, чтобы увидеть, соответствует ли вывод соответствующему элементу (по индексу) второго массива. Если есть совпадение, элемент из первого массива становится ключом в объекте, а элемент из второго массива становится соответствующим значением.

Мой код пока что

function objOfMatches(inray1, inray2, callback)
{
  let outray1 = inray1, outray2 = inray2;
  let obj = new Object();
  let longerray = [];
  if(inray1.length > inray2.length)
  {
    longerray = inray1;
  }
  else
  {
    longerray = inray2;
  }
  
  for(let a = 0; a < longerray.length; a++)
  {
    if(callback(outray1[a]) === callback(outray2[a]))
    {
      obj = { [outray1[a]]: [outray2[a]] }; //Only has last matching array element
    }
  }
  
  return obj;
}

// Uncomment these to check your work!
 var arr1 = ['hi', 'howdy', 'bye', 'later', 'hello'];
 var arr2 = ['HI', 'Howdy', 'BYE', 'later', 'HELLO'];
 function uppercaser(str) { return str.toUpperCase(); }
 console.log(objOfMatches(arr1, arr2, uppercaser)); // should log: { hi: 'HI', bye: 'BYE', hello: 'HELLO' }

Ответы [ 4 ]

0 голосов
/ 03 июля 2018

вот мой: -)

function objOfMatches(arr1, arr2, cb) {
  const len = Math.max(arr1.length, arr2.length);
  const oResult = {};
  for (let i = 0; i < len; i++) {
    if (cb(arr1[i]) === arr2[i]) {
      oResult[arr1[i]] = arr2[i];
    }    
  }
  return oResult;
}

var arr1 = ['hi', 'howdy', 'bye', 'later', 'hello'];
var arr2 = ['HI', 'Howdy', 'BYE', 'later', 'HELLO'];
function uppercaser(str) { return str.toUpperCase(); }
console.log(objOfMatches(arr1, arr2, (str) => {
  return (str || '').toUpperCase();
})); // should log: { hi: 'HI', bye: 'BYE', hello: 'HELLO' }
0 голосов
/ 03 июля 2018

Вот, пожалуйста.

Ниже работает код:

var arr1 = ['hi', 'howdy', 'bye', 'later', 'hello'];
var arr2 = ['HI', 'Howdy', 'BYE', 'later', 'HELLO'];
var obj = {};

for (var i = 0; i < arr1.length; i++) {
  if (arr1[i] === arr2[i].toLowerCase()) {
    obj[arr1[i]] = arr2[i];
  }
}


console.log(obj);
0 голосов
/ 03 июля 2018

Array.reduce() - довольно стандартный javascript для получения массива и возврата чего-то другого, например объекта. Вам не нужно проверять самый длинный массив. Вам просто нужно убедиться, что вы не обрабатываете возможную undefined для вашей функции сравнения.

var arr1 = ['hi', 'howdy', 'bye', 'later', 'hello'];
var arr2 = ['HI', 'Howdy', 'BYE', 'later', 'HELLO'];

const  uppercaser = (str) => str && str.toUpperCase()

function objOfMatches(inray1, inray2, comp) {
    return inray1.reduce((a, c, i) => {
        if (comp(c) === comp(inray2[i])) a[c] = inray2[i]
        return a
    }, {})
}
console.log(objOfMatches(arr1, arr2, uppercaser))
0 голосов
/ 03 июля 2018

Вы на самом деле не описываете, в чем заключается ваша проблема, но я полагаю, что вы не получаете ожидаемого результата. Вместо создания нового объекта в цикле вы должны присвоить объекту, который вы создали ранее:

obj[outray1[a]] = outray2[a];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...