首页 > 解决方案 > 使用纯 JS 或 Lodash 基于 Array 对集合键进行排序

问题描述

我想products根据 Array 对集合键进行排序order。我期待像expecting. 有没有人在纯 JS 或 Lodash 库中有一个简单的解决方案?

您可以从repl.it找到源代码

谢谢

const _ = require('lodash')

var products = [
  {cgst: "18", item: "UPS V Guard Slender 1450", price: "2800", sgst: "18", stock: 2},
  {cgst: "9", item: "UPS V Guard Prime 1450", price: "6000", sgst: "9", stock: 30}
]
var order = ['item', 'price', 'cgst', 'sgst', 'stock']

// Expecting output
var expecting = [
  {item: "UPS V Guard Slender 1450", price: "2800", cgst: "18", sgst: "18", stock: 2},
  {item: "UPS V Guard Prime 1450", price: "6000", cgst: "9", sgst: "9", stock: 30}
]

标签: arrayssortingcollectionslodash

解决方案


您的问题实际上是订购 CSV 字段,而不是对象属性。该Papa.unparse()方法接受一个带有fields和的对象data。您可以将订单传递给它:

var products = [
  {cgst: "18", item: "UPS V Guard Slender 1450", price: "2800", sgst: "18", stock: 2},
  {cgst: "9", item: "UPS V Guard Prime 1450", price: "6000", sgst: "9", stock: 30}
]
var order = ['item', 'price', 'cgst', 'sgst', 'stock']

var csv = Papa.unparse({
	fields: order,
	data: products
});

console.log(csv);
<script src="https://cdnjs.cloudflare.com/ajax/libs/PapaParse/4.5.0/papaparse.min.js"></script>

如果您确实需要订单对象属性的顺序:

您可以Array.map()_.pick()正确的顺序获取对象属性。

注意:在 ES6 中对象属性有一个顺序,但它有一些怪癖。见这篇文章

var products = [
  {cgst: "18", item: "UPS V Guard Slender 1450", price: "2800", sgst: "18", stock: 2},
  {cgst: "9", item: "UPS V Guard Prime 1450", price: "6000", sgst: "9", stock: 30}
]
var order = ['item', 'price', 'cgst', 'sgst', 'stock']

// Expecting output
var expecting = [
  {item: "UPS V Guard Slender 1450", price: "2800", cgst: "18", sgst: "18", stock: 2},
  {item: "UPS V Guard Prime 1450", price: "6000", cgst: "9", sgst: "9", stock: 30}
]

var result = products.map(o => _.pick(o, order))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>


推荐阅读