用对象中的值交换键

IT技术 javascript node.js key-value
2021-01-15 17:09:09

我有一个非常大的 JSON 对象,其结构如下:

{A : 1, B : 2, C : 3, D : 4}

我需要一个可以与对象中的键交换值的函数,但我不知道该怎么做。我需要这样的输出:

{1 : A, 2 : B, 3 : C, 4 : D}

有什么办法可以做到这一点,手动创建一个新的对象,所有的东西都被交换了?
谢谢

6个回答
function swap(json){
  var ret = {};
  for(var key in json){
    ret[json[key]] = key;
  }
  return ret;
}

此处的示例FIDDLE不要忘记打开您的控制台以查看结果。


ES6版本:

static objectFlip(obj) {
  const ret = {};
  Object.keys(obj).forEach(key => {
    ret[obj[key]] = key;
  });
  return ret;
}

或者使用Array.reduce() & Object.keys()

static objectFlip(obj) {
  return Object.keys(obj).reduce((ret, key) => {
    ret[obj[key]] = key;
    return ret;
  }, {});
}

或者使用Array.reduce() & Object.entries()

static objectFlip(obj) {
  return Object.entries(obj).reduce((ret, entry) => {
    const [ key, value ] = entry;
    ret[ value ] = key;
    return ret;
  }, {});
}

您可以使用lodash 函数 _.invert它也可以使用 multivlaue

 var object = { 'a': 1, 'b': 2, 'c': 1 };

  _.invert(object);
  // => { '1': 'c', '2': 'b' }

  // with `multiValue`
  _.invert(object, true);
  // => { '1': ['a', 'c'], '2': ['b'] }
从 lodash 4: 而不是设置multiValuetrue您需要使用新方法_.invertBy()
2021-04-01 17:09:09
不再支持 multiValue
2021-04-10 17:09:09

使用 ES6:

const obj = { a: "aaa", b: "bbb", c: "ccc", d: "ddd" };
Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })))
@peter-krauss,欢迎您修改jsben.ch/gHEtn,以防我遗漏了什么,但是这个答案和 jPO 的答案之间的随意比较表明 jPO 的 for 循环比 grappeq 的 map 方法的性能好几乎 3 比 1(至少在我的浏览器上)。
2021-03-24 17:09:09
我试过了 - 比我电脑上的 jPO 慢 30%。
2021-04-11 17:09:09
似乎是当今(2019 年)更好的解决方案有人可以确认,是吗?性能好吗?语义是完美的:我们可以看到这确实是一个简单的“映射和交换”解决方案。
2021-04-14 17:09:09

现在我们有了 Object.fromEntries:

obj => Object.fromEntries(Object.entries(obj).map(a => a.reverse()))

或者

obj => Object.fromEntries(Object.entries(obj).map(([k, v]) => [v, k]))

(更新以删除多余的括号 - 感谢 @devin-g-rhode)

从 Node.js 版本 12 开始,也应该是进行对象交换的标准方式。
2021-03-29 17:09:09
这是最容易理解+最漂亮的解决方案。我认为您可以将父项放在箭头回调的返回值上
2021-04-11 17:09:09

获取对象的key,然后使用Array的reduce函数遍历每个key,设置value为key,key为value。

const data = {
  A: 1,
  B: 2,
  C: 3,
  D: 4
}
const newData = Object.keys(data).reduce(function(obj, key) {
  obj[data[key]] = key;
  return obj;
}, {});
console.log(newData);