Назначить массив как значение объекта на карте - PullRequest
0 голосов
/ 15 июня 2019

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

var list = ['ab', 'cd', 'acb', 'dc', 'ba', 'abc', 'cba', 'bca'];

var oMap = {};
var pairs = [];

for(var i=0; i <list.length; i++){ 
  var temp = sortstr(list[i]);
  oMap[temp] = {};
  if(temp in oMap){
      if(temp === sortstr(list[i])){
        oMap[temp] = temp + "," + list[i];  --> should store in array
      }
  }
  else {
    oMap[temp] = {};
    oMap[temp] = list[i];
  }
}

console.log(oMap);

function sortstr(text) {
    return text.split('').sort().join('');
};

Ожидаемый результат:

{ab: [ab,ba], cd: [cd,dc], abc: [abc,bca,acb,cba] }

Фактический результат:

{ab: "ab,ba", cd: "cd,dc", abc: "abc,bca"}

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

В приведенном ниже коде есть две строки, добавленные мной.

oMap[temp] = oMap[temp] || [];

Он проверит, существует ли свойство temp в oMap, затем оставит его значение таким же, иначе он станет пустым массивом.

oMap[temp].push(list[i]);

Это добавит новое значение в конец массива, который находится в temp в oMap

var list = ['ab', 'cd', 'acb', 'dc', 'ba', 'abc', 'cba', 'bca'];

var oMap = {};
var pairs = [];

for(var i=0; i <list.length; i++){ 
  var temp = sortstr(list[i]);
   oMap[temp] = oMap[temp] || [];
   oMap[temp].push(list[i]);
}

console.log(oMap);

function sortstr(text) {
    return text.split('').sort().join('');
};

Вы строите одно значение из массива, поэтому, если вам нужны функции более высокого порядка, вы можете использовать reduce()

var list = ['ab', 'cd', 'acb', 'dc', 'ba', 'abc', 'cba', 'bca'];


const res = list.reduce((ac,a) => {
  let k = sortstr(a);
  ac[k] = (ac[k] || []).concat(a);
  return ac;
},{})

console.log(res)


function sortstr(text) {
    return text.split('').sort().join('');
};
2 голосов
/ 15 июня 2019

Вам нужен массив в качестве цели для значений и пропустите некоторые проверки и ненужные назначения.

function sortstr(text) {
    return text.split('').sort().join('');
}

var list = ['ab', 'cd', 'acb', 'dc', 'ba', 'abc', 'cba', 'bca'],
    oMap = {},
    temp, i;

for (i = 0; i < list.length; i++) {
    temp = sortstr(list[i]);
    if (temp in oMap) {
        oMap[temp].push(list[i]);
    } else {
        oMap[temp] = [list[i]];
    }
}

console.log(oMap);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Еще более короткий подход с использованием значения по умолчанию для ложного контента.

function sortstr(text) {
    return text.split('').sort().join('');
}

var list = ['ab', 'cd', 'acb', 'dc', 'ba', 'abc', 'cba', 'bca'],
    oMap = {},
    temp, i;

for (i = 0; i < list.length; i++) {
    temp = sortstr(list[i]);
    oMap[temp] = oMap[temp] || []; // check if truthy or take array
    oMap[temp].push(list[i]);
}

console.log(oMap);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...