indexBy在lodash / underscore中相反?

时间:2014-10-02 06:04:17

标签: underscore.js lodash

我有一个带键的对象

 var obj = { a: { fruit: 'Apple' }, b: { fruit: 'Banana' } }

我想快速将密钥(a / b)作为属性name移动到值。我可以找出quicker way来做这件事。

 _(obj).keys().each(function(key)
 {
     obj[key].name = key;
 })
 var results = _.values(obj);

这不仅仅是出于审美原因,我不能使用function关键字,因为它是一个角度表达式

3 个答案:

答案 0 :(得分:2)

感兴趣的人,这就是我最终做到这一点的方式:

_.mixin({
    toArrayFromObj: function (object, keyName)
    {
        return _(object).keys().map(function (item)
        {
            object[item][keyName] = item;
            return object[item];
        }).value();
    }
});

我很乐意接受名称或实施建议。

答案 1 :(得分:2)

我提出了一个稍微不同的解决方案:

_.mixin({
  disorder: function(collection, path) {
    return _.transform(collection, function(result, item, key) {
      if (path)
        _.set(item, path, key);

      result.push(item);
    }, []);
  }
});

由于使用了_.set,密钥属性也可以转移到嵌套属性。

var indexedBooks = { 
  'a1': { title: 'foo' }, 
  'a2': { title: 'bar' }
};

var books = _.disorder(indexedBooks, 'author._id');
// → [{ 'title': 'foo', 'author': { '_id': 'a1' }},
//    { 'title': 'bar', 'author': { '_id': 'a2' }}]

答案 2 :(得分:0)

这是我在打字稿中反转lodash的keyBy的版本。

import { List, Dictionary } from 'lodash';

function unkeyBy<T>(object: Dictionary<T>, key = 'id'): List<T> {
  return Object.keys(object).map((item) => {
    return { [key]: item, ...object[item] };
  });
}