如何在lodash map函数中获取一个用作变量的键?

时间:2016-02-22 20:24:02

标签: javascript lodash

我试图重新构建一个对象以便于进行。

这是一般结构:

 var dictionary = { "word": {"content": "wordy"}, "palabra": {"content":"palabrota" }};

我希望它看起来像这样:

 [{"wordy":"word"},{"palabrota":"palabra"}]

我正在尝试使用此代码:

_.map(dictionary, function(v,k){ var new_key = v.content;return { new_key: k };} );

但不是我所期待的,这就是结果:

[ { new_key: 'word' }, { new_key: 'palabra' } ]

如何在此函数中获取用作变量的键?

2 个答案:

答案 0 :(得分:2)

您可以使用_.invertBy method(从LoDash v4.1.0开始),它将为您提供键和值数组,从而确保不会覆盖这些值。

var dictionary = {
  "word": {"content": "wordy"},
  "anotherWord": {"content": "wordy"},
  "palabra": {"content":"palabrota" }
};

var result = _.invertBy(dictionary, function(item) {
  return item.content;
});

// "{"wordy":["word","anotherWord"],"palabrota":["palabra"]}"

编辑:早先的回复如下。这是有效的,但是限制是重复的内容值会覆盖密钥。下面的_.transform文档展示了如何生成一个数组来处理重复项,类似的设置可以用于常规的JS方法。

您可以使用_.transform method

var transformedResult = _.transform(dictionary, function(result, value, key) {
    return result[value.content] = key;
}); 

或者根本没有LoDash,您可以按预期构建对象。

var result = {};
Object.keys(dictionary).forEach(function(key) {
    var value = dictionary[key].content;
    result[value] = key;
});

答案 1 :(得分:1)

为简单起见,我可能会推荐_.mapValues(dictionary, "content")

但是,[{"wordy":"word"},{"palabrota":"palabra"}]取代{"wordy": "word", "palabrota": "palabra"}而不是_.mapValues,而不是start_time。但鉴于你正在使用lodash,并且lodash几乎可以互换地处理数组和对象,我认为非数组版本会更方便。