如何反转 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);