首页 > 解决方案 > 将数组分配为地图中的对象值

问题描述

我必须在下面解决这个问题。输出应该是一个对象映射,其中键作为排序值,所有其他变体作为分配给排序键的数组。我能够将值生成为字符串,但不能生成为包含所有值的数组。任何指针?

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"}

标签: javascriptarraysstringsorting

解决方案


您需要一个数组作为值的目标,并省略一些检查和不必要的分配。

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; }


推荐阅读