动态交换Javascript对象中的键/值

时间:2019-02-21 16:25:33

标签: javascript arrays mapreduce

我将在分组的直方图中显示我从数据库聚合的数据。

数据如下:

[
  {
    "_id": "Gas Separator Filter",
    "sellingPrice": 100000,
    "quantity": 10
  },
  {
    "_id": "Dry Gas Cartridge",
    "sellingPrice": 6005000,
    "quantity": 15
  }
]

但是为了将其显示在图表中并进行分组,我需要这样的东西。对于上面的数据集中的每个_id,我应该能够在图表中看到两个条形。

[
  {
    "name": "quantity",
    "Gas Separator Filter": 10,
    "Dry Gas Cartridge": 15
  },
  {
    "name": "sellingPrice",
    "Gas Separator Filter": 100000,
    "Dry Gas Cartridge": 6005000
  }
]

已经两个小时了,我想不出一个好方法。您会提出什么建议?

3 个答案:

答案 0 :(得分:2)

这是使用旧式循环的一种解决方案:)

const transform = (data, nameValues, keyProp) => {
    const result = [];

	for (const name of nameValues) {
		const output = { name };

		for (const value of data) {
			output[value[keyProp]] = value[name];
		}
		result.push(output);
	}

	return result;
};

const result = transform(
    [
        {
            "_id": "Gas Separator Filter",
            "sellingPrice": 100000,
            "quantity": 10
        },
        {
            "_id": "Dry Gas Cartridge",
            "sellingPrice": 6005000,
            "quantity": 15
        }
    ],
    ["sellingPrice", "quantity"],
    "_id"
);

console.log(result);

答案 1 :(得分:1)

您可以使用array.reduce实现此目的:

const arrayToArray = (array) => {
 var ret = [{
         "name": "price"
     }, {
         "name": "quantity"
     }
 ];
 return array.reduce((obj, item, idx, original) => {
     ret[0][item._id] = original[idx].sellingPrice;
     ret[1][item._id] = original[idx].quantity;
     return ret;
 }, 0)
}

像这样,您用基础对象设置了一个变量,并用_id:value填充了价格和数量。 但这不是“优雅”的方式。您确定需要此对象数组结构来显示图表吗?

答案 2 :(得分:1)

我发现很难解释我的解决方案,但这是我的看法(您可以为不同的变量添加console.log来跟随转换):

提取对象中的所有键,对其进行循环,name将是该键,并使用嵌套循环来设置其他键和值:

const data = [ { "_id": "Gas Separator Filter", "sellingPrice": 100000, "quantity": 10 }, { "_id": "Dry Gas Cartridge", "sellingPrice": 6005000, "quantity": 15 } ]

const [_id, ...keys] = [...new Set(data.map(e => Object.keys(e)).flat())]

// console.log(keys) : ["sellingPrice", "quantity"]

const result = keys.map(key => {
  const values = data.map(obj => ({
    [obj._id]: obj[key]
  }))

  return Object.assign({
    name: key
  }, ...values);
})

console.log(result)