我想重新排序这个数组:
[{ a: "v1", b: "v2"} , {a: "v3", b: "v4"}]
到此:
{a: ["v1", "v3"] , b: ["v2", "v4"]}
注意:有必要保证顺序,第一个数组元素应该是每个关键对象中数组值的第一个元素
答案 0 :(得分:1)
Pure js解决方案,使用Array#forEach
和Object.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"]));
此版本的要点是,即使您的数组包含具有不同键的对象(如示例中,一个对象具有a
和b
,其中一个具有a
}和c
,其中一个有b
和c
),这将永远是真的:
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解决方案,它使用spread和mergeWith的组合来合并具有相似属性的所有对象。
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;
答案 4 :(得分:0)
另一个(短)lodash解决方案,使用reduce
和mergeWith
的组合:
_.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), {});