我一直在尝试组合具有相同值的对象。我拥有的对象是这样的:
{
'Mon': [{'apple': 'A', 'color': 'green'}, {'apple':'B', 'color':'yellow'}],
'Tue': [{'apple': 'A', 'color': 'green'}, {'apple':'B', 'color':'yellow'}],
'Wed': [],
'Thu': [],
'Fri': [{'banana': 'A', 'color': 'yellow'}],
'Sat': [{'banana': 'A', 'color': 'yellow'}],
'Sun': [{'banana': 'A', 'color': 'yellow'}]
}
我一直试图找到一种方法来组合这些,以便结果如下:
{
['Mon', 'Tue']: [{'apple': 'A', 'color': 'green'}, {'apple':'B','color':'yellow'}],
['Wed', 'Thu']: [],
['Fri','Sat','Sun']: [{'banana': 'A', 'color': 'yellow'}]
}
有没有办法用lodash
执行此操作?还是纯粹的js?
答案 0 :(得分:1)
在Javascript中,对象的键必须是字符串。
但是,您可以使用数组,它们将被转换为字符串:
var a = {};
a[['Mon', 'Tue']] = 1;
console.log(a[['Mon', 'Tue']])
console.log(a)
但是,当然,最终对象的键是字符串。无论如何,如果你需要它们,创建一个将它们转换回数组的函数应该是微不足道的。
关于处理数据,我会这样:
var original = {
'Mon': [{'apple': 'A', 'color': 'green'}, {'apple':'B', 'color':'yellow'}],
'Tue': [{'apple': 'A', 'color': 'green'}, {'apple':'B', 'color':'yellow'}],
'Wed': [],
'Thu': [],
'Fri': [{'banana': 'A', 'color': 'yellow'}],
'Sat': [{'banana': 'A', 'color': 'yellow'}],
'Sun': [{'banana': 'A', 'color': 'yellow'}]
};
var emptyKey = [];
function createId(o) {
var values = [];
for (let x in o) {
if (o.hasOwnProperty(x)) {
values.push(o[x])
}
}
return Object.keys(o).sort().toString() + values.sort().toString();
}
var uniqueValues = [];
for (let d in original) {
for (let b in original[d]) {
let idx = createId(original[d][b]);
if (uniqueValues.indexOf(idx) === -1) uniqueValues.push(idx);
}
if (Object.keys(original[d]).length === 0) emptyKey.push(d);
}
var result = {};
for (let u in uniqueValues) {
let k = [];
let o = null;
for (let d in original) {
for (let b in original[d]) {
let idx = createId(original[d][b]);
if (uniqueValues[u] === idx) {
k.push(d);
o = original[d][b];
}
}
}
if (k.length > 0) {
result[k] = result[k] || [];
result[k].push(o);
}
}
if (emptyKey.length > 0) result[emptyKey] = [];
console.log(result)
然而,解决方案的一些警告:
toString()
方法)。sort()
方法的原因 - 如果所有主流浏览器都按照插入顺序打印它们