减少javascript对象中的重复

spr*_*man 5 javascript reduce

我有一个像这样的对象:

{
    a : 'foo',
    b : 'bar',
    c : 'foo',
    d : 'baz',
    e : 'bar'
}
Run Code Online (Sandbox Code Playgroud)

我想减少重复,如:

{
    ac : 'foo',
    be : 'bar',
    d : 'baz'
}
Run Code Online (Sandbox Code Playgroud)

有什么好办法呢?

一些警告:

  • 只会有少量的配对.(目前有7个;我可以想象它会上升到20个.)
  • 初始属性名称将只是单个字符,如示例中所示
  • 这些值可能会运行到几百个字符.
  • 速度和代码长度都非常重要,但考虑到行数很少,代码清晰度可能仍然是最重要的.

Poi*_*nty 0

遍历对象的每个属性并构造另一个对象,其中键是第一个对象的值,值是键列表(从第一个开始)。然后你返回第二个对象并得出最终结果。

像这样的东西:

function noDupes(obj) {
  var o2 = {};
  for (var k in obj) {
    if (obj.hasOwnProperty(k)) {
      var list = o2[obj[k]] || [];
      list.push(k);
      o2[obj[k]] = list;
    }
  }
  var rv = {};
  for (k in o2) {
    if (o2.hasOwnProperty(k))
      rv[o2[k].join('')] = k;
  }
  return rv;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果原始对象的值不是字符串,那么事情就会变得更加复杂:只有字符串才能成为 Javascript 对象中的属性键。在这种情况下,您可以寻找更通用的哈希实现。如果您的对象往往非常小(少于 10 个左右的属性),您可以编写 n 2版本,在其中您只需迭代属性,然后对每个属性再次迭代。但是,如果您的对象可能很大并且您必须多次执行此操作,那么这可能是一个坏主意。