用lodash重新排序数组对象

时间:2017-03-26 17:22:29

标签: javascript lodash

我想重新排序这个数组:

[{ a: "v1", b: "v2"} , {a: "v3", b: "v4"}]

到此:

{a: ["v1", "v3"] , b: ["v2", "v4"]}

注意:有必要保证顺序,第一个数组元素应该是每个关键对象中数组值的第一个元素

5 个答案:

答案 0 :(得分:1)

Pure js解决方案,使用Array#forEachObject.keys



var arr = [{ a: "v1", b: "v2"} , {a: "v3", b: "v4"}],
    obj = {};
    
    arr.forEach(c => Object.keys(c).forEach(function(v){
      (obj[v] || (obj[v] = [])).push(c[v]);
    }));
    
    console.log(obj);
        




答案 1 :(得分:0)

@Kind用户代码的扩展版本,它还处理具有不同密钥的对象:

function mapByKey(source){
  var result = Object.create(null);
  source.forEach((item, index) => {
    if(item == null) return;
    Object.keys(item).forEach(key => {
      if(!(key in result)){
        //don't use sparse Arrays
        result[key] = Array(source.length).fill(undefined); 
      }

      result[key][index] = item[key];
    })
  })
  return result;
}

var array = [
  {a: "v1", b: "v2"}, 
  {a: "v3", c: "v4"}, 
  {b: "v5", c: "v7"}
];
var mapping = mapByKey(array);

console.log(mapping);

//or something funny:
console.log(mapByKey(["foo", "bar", "baz", "asdf"]));

此版本的要点是,即使您的数组包含具有不同键的对象(如示例中,一个对象具有ab,其中一个具有a }和c,其中一个有bc,这将永远是真的:

array[index][key] === mapping[key][index];

答案 2 :(得分:0)

使用Array.prototype.reduce()Object.keys()函数的替代解决方案:



var arr = [{ a: "v1", b: "v2"} , {a: "v3", b: "v4"}],
    result = arr.reduce(function (r, o) {
        Object.keys(o).forEach(function(k){ (r[k])? r[k].push(o[k]) : r[k] = [o[k]]; });
        return r;
    }, {});

console.log(result);




答案 3 :(得分:0)

这是一个lodash解决方案,它使用spreadmergeWith的组合来合并具有相似属性的所有对象。

var result = _.spread(_.mergeWith)([{}].concat(data, 
  _.flow(_.ary(_.concat, 2), _.compact)
));



var data = [{
  a: "v1",
  b: "v2"
}, {
  a: "v3",
  b: "v4"
}, {
  a: "v5",
  b: "v6",
  c: "1"
}];

var result = _.spread(_.mergeWith)([{}].concat(data, 
  _.flow(_.ary(_.concat, 2), _.compact)
));

console.log(result);

body>div {
  min-height: 100%;
  top: 0;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

另一个(短)lodash解决方案,使用reducemergeWith的组合:

_.reduce(data, (acc, x) => _.mergeWith(acc, x, 
                                            (obj = [], src) => obj.concat(src)),
         {});

或者更具可读性:

const customizer = (obj = [], src) => obj.concat(src);
_.reduce(data, (acc, x) => _.mergeWith(acc, x, customizer), {});

甚至:

const customizer = (obj = [], src) => obj.concat(src);
_.reduce(data, _.partialRight(_.mergeWith, customizer), {});