如何反转 Javascript 中的对象数组?
How can I reverse an array of object in Javascript?
我有一个这样写的数组:
[
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }
]
我想得到一个这样写的数组:
[
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: ['TestMetaCoin','Contract: MetaCoin'] },
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: ['TestMetaCoin','Contract: MetaCoin'] }
]
我尝试使用 nodejs 函数 restore()
但结果是:
[
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: 'Contract: MetaCoin' },
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: 'Contract: MetaCoin' }
]
它完全覆盖了位置 2 和 4 中的值,可能是因为它试图创建一个现有的键,因此无法创建它,通过覆盖存在的值而不是创建一个包含 2 的数组来访问旧键值。
我怎样才能解决这个问题?
这是我使用的代码:
var fristArray= [
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }
]
var swapped=[]
for(var i=0;i<fristArray.length;i++) {
swapped.push(Object.fromEntries(Object.entries(fristArray[i]).map(([k, v]) => [v, k])))
}
console.log(swapped)
您可以先使用新键创建目标对象,并为每个键创建一个空数组作为值。然后填充这些数组。最后,当它们碰巧只有一个元素时,用单个值替换这些数组中的任何一个。否则将它们保留为数组:
function swapper(obj) {
let result = Object.fromEntries(Object.values(obj).map(value => [value, []]));
for (let [key, value] of Object.entries(obj)) result[value].push(key);
for (let [key, value] of Object.entries(result)) {
if (value.length === 1) result[key] = value[0];
}
return result;
}
var firstArray = [{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }];
var swapped = firstArray.map(swapper);
console.log(swapped);
备选
这里我们先存单个值,需要的时候再转成数组
function swapper(obj) {
let result = {};
for (let [key, value] of Object.entries(obj)) {
result[value] = value in result ? [key].concat(result[value]) : key;
}
return result;
}
var firstArray = [{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }];
var swapped = firstArray.map(swapper);
console.log(swapped);
您可以尝试这样的操作:
const invertKeyValues = (obj, fn) =>
Object.keys(obj).reduce((acc, key) => {
const val = fn ? fn(obj[key]) : obj[key];
acc[val] = acc[val] || [];
acc[val].push(key);
return acc;
}, {});
如果您有兴趣,这里有一个详尽的 one-liner 解决方案,只使用 ES6 函数。
var fristArray = [
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }
]
var swapped = fristArray.map(obj =>
Object.entries(obj).reduce((acc, [k, v]) => ({ ...acc, [v]: acc[v] ? [acc[v], k].flat() : k }), {})
);
console.log(swapped);
const arr = [
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
];
const reverseArr = arr.map(obj => {
const newObj = {};
Object.keys(obj).forEach(key => {
const newKey = obj[key];
if (newObj[newKey]) {
if (Array.isArray(newObj[newKey])) {
newObj[newKey].push(key);
} else {
newObj[newKey] = [newObj[newKey], key];
}
} else {
newObj[newKey] = key;
}
});
return newObj;
}
);
console.log(reverseArr);
我有一个这样写的数组:
[
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }
]
我想得到一个这样写的数组:
[
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: ['TestMetaCoin','Contract: MetaCoin'] },
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: ['TestMetaCoin','Contract: MetaCoin'] }
]
我尝试使用 nodejs 函数 restore()
但结果是:
[
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: 'Contract: MetaCoin' },
{ L: 'TestMetaCoin', K: 'Contract: MetaCoin' },
{ L: 'Contract: MetaCoin' }
]
它完全覆盖了位置 2 和 4 中的值,可能是因为它试图创建一个现有的键,因此无法创建它,通过覆盖存在的值而不是创建一个包含 2 的数组来访问旧键值。 我怎样才能解决这个问题? 这是我使用的代码:
var fristArray= [
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }
]
var swapped=[]
for(var i=0;i<fristArray.length;i++) {
swapped.push(Object.fromEntries(Object.entries(fristArray[i]).map(([k, v]) => [v, k])))
}
console.log(swapped)
您可以先使用新键创建目标对象,并为每个键创建一个空数组作为值。然后填充这些数组。最后,当它们碰巧只有一个元素时,用单个值替换这些数组中的任何一个。否则将它们保留为数组:
function swapper(obj) {
let result = Object.fromEntries(Object.values(obj).map(value => [value, []]));
for (let [key, value] of Object.entries(obj)) result[value].push(key);
for (let [key, value] of Object.entries(result)) {
if (value.length === 1) result[key] = value[0];
}
return result;
}
var firstArray = [{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }];
var swapped = firstArray.map(swapper);
console.log(swapped);
备选
这里我们先存单个值,需要的时候再转成数组
function swapper(obj) {
let result = {};
for (let [key, value] of Object.entries(obj)) {
result[value] = value in result ? [key].concat(result[value]) : key;
}
return result;
}
var firstArray = [{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }];
var swapped = firstArray.map(swapper);
console.log(swapped);
您可以尝试这样的操作:
const invertKeyValues = (obj, fn) =>
Object.keys(obj).reduce((acc, key) => {
const val = fn ? fn(obj[key]) : obj[key];
acc[val] = acc[val] || [];
acc[val].push(key);
return acc;
}, {});
如果您有兴趣,这里有一个详尽的 one-liner 解决方案,只使用 ES6 函数。
var fristArray = [
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' }
]
var swapped = fristArray.map(obj =>
Object.entries(obj).reduce((acc, [k, v]) => ({ ...acc, [v]: acc[v] ? [acc[v], k].flat() : k }), {})
);
console.log(swapped);
const arr = [
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'K' },
{ TestMetaCoin: 'L', 'Contract: MetaCoin': 'L' },
];
const reverseArr = arr.map(obj => {
const newObj = {};
Object.keys(obj).forEach(key => {
const newKey = obj[key];
if (newObj[newKey]) {
if (Array.isArray(newObj[newKey])) {
newObj[newKey].push(key);
} else {
newObj[newKey] = [newObj[newKey], key];
}
} else {
newObj[newKey] = key;
}
});
return newObj;
}
);
console.log(reverseArr);