【问题标题】:Assign array as an Object value in a map将数组分配为地图中的对象值
【发布时间】:2019-06-15 14:39:47
【问题描述】:

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

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

【问题讨论】:

  • 发布的代码没有明显尝试创建数组。究竟是什么问题?
  • 如果我尝试将此行存储在array oMap[temp] = temp + "," + list[i]; 中,则获取数组中的所有值,就像oMap[temp] = pairs.push(list[i]); 一样

标签: javascript arrays string sorting


【解决方案1】:

下面代码中有两行是我自己加的。

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

它将检查temp 属性是否已存在于oMap 上,然后保持其值不变,否则将其设为空数组。

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

它将新值添加到数组的末尾,即temp in 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】:

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

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

    【讨论】:

    • 哇太棒了。通过分配像这样的值,我犯了一个菜鸟错误pairs.push(list[i]); oMap[temp] = 对;
    • 我收到此错误Uncaught TypeError: oMap[temp].push is not a function at app.js:9
    猜你喜欢
    • 2019-06-16
    • 2020-02-05
    • 2018-12-06
    • 1970-01-01
    • 2016-05-10
    • 2017-07-01
    • 1970-01-01
    • 2017-12-08
    • 2019-12-06
    相关资源
    最近更新 更多