按值类型分组对象

Group object by value type

我有这个对象:

const data = {
  a: 'name',
  b: 'age',
  c: 'age',
  d: 'age',
  e: 'name',
  f: 'age'
}

我想按值分组,所以我想要:

const result = {
  name: ['a', 'e'],
  age: ['b', 'c', 'd', 'f']
}

有什么聪明的方法吗?

一种方法:

const map = new Map;
Object.keys(data).forEach(key => {
  const value = data[key];
  if (!map.has(value))
    map.set(value, []);
  map.get(value).push(key);
});
const result = {};
map.forEach((key, value) => {
  result[value] = key;
});
console.log(result);

您可以遍历所有键并检查相应的值是否已作为键分配给您的结果对象;如果是,则将密钥推入数组,如果不是,则将其初始化为数组。

像这样的东西会起作用:

const data = { a: 'name',  b: 'age',  c: 'age',  d: 'age',  e: 'name',  f: 'age' }

const output = {};

Object.keys(data).forEach(key => {
  if (!output[data[key]]) {
    // new key: assign it as a 1 element array
    output[data[key]] = [key];
  } else {
    // existing key: push it into the array
    output[data[key]].push(key);
  }
});

console.log(output);

添加了一些好的解决方案,但 Object.entries 可以更清楚吗?

const data = { a: 'name',  b: 'age',  c: 'age',  d: 'age',  e: 'name',  f: 'age' }

const results = {};
Object.entries(data).forEach(([key, value]) => {
  if (results[value]) { 
    results[value].push(key);
  } else {
    results[value] = [key];
  }
});

console.log(results)

最简洁的版本,感谢 Nick 的逗号运算符来保存卷曲

const data = { a: 'name',  b: 'age',  c: 'age',  d: 'age',  e: 'name',  f: 'age' },
 arr = Object.entries(data)
  .reduce((acc, [key,value]) => ((acc[value] ??=[]).push(key), acc),{});

console.log(arr)

解释,因为这很有趣,可以添加到一个人的武器库中

(acc,  // accumulator defined by the {} at the end of the statement
 [key,value]  // destructing the entries
 ) => 
 ( // bracket to set up the comma operator later
  (acc[value] ??=[])  // nullish coalescing assignment - if no acc[value] then assign an array
  .push(key)
  , acc) // comma operator returns what is after the comma
  ,{});

另一种方式:

const data = { a: 'name',  b: 'age',  c: 'age',  d: 'age',  e: 'name',  f: 'age' }

const newData = {};
Object.entries(data).forEach(pair => {
const [key, value] = pair;
  if (!newData[value])
    newData[value] = [];
  newData[value].push(key)
});
console.log(newData)