使用 Ramda.js 求和和排序
Sum and sort with Ramda.js
我有一个对象,它有这样的数字数组对象:
books = [{
id: "a6113b1cd5d4617f63bb10abc874bea7",
times: [{
0: 1,
1: 5
}],
length: 1,
rating: 4.77,
}, {
id: "b6113b1cd5d4617f63bb10abc874bea7",
times: [{
0: 8
}],
length: 1,
rating: 2.6,
}]
我想添加 按时间排序,但这需要是该对象内所有元素的总和 - 在第一个对象的示例中它是 1+5=6第二个对象是 8,所以排序的最终结果是第一个对象,然后是第二个。这是我到目前为止所拥有的,但它是不完整的。你知道我如何得到数组的总和吗?
const timesSorting = R.ascend(R.path(['times']))
const sorting = R.sortWith([timesSorting])
sorting(books)
使用R.sortBy,因为您需要按单个属性 排序。创建一个获取 time
属性的函数,使用 R.chain
和 R.values
获取时间数组中所有值的数组,并对它们求和。
const { pipe, prop, chain, values, sum, sortBy} = R
const getTimesSum = pipe(prop('times'), chain(values), sum);
const sorting = sortBy(getTimesSum)
const books = [{"id":"a6113b1cd5d4617f63bb10abc874bea7","times":[{"0":1,"1":5}],"length":1,"rating":4.77},{"id":"b6113b1cd5d4617f63bb10abc874bea7","times":[{"0":8}],"length":1,"rating":2.6}]
const result = sorting(books)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
如果times
始终是一个数组,其中包含具有数字索引的单个对象,您可以将times
简化为一个数字数组,然后求和会更容易:
const { pipe, prop, sum, sortBy } = R
const getTimesSum = pipe(prop('times'), sum);
const sorting = sortBy(getTimesSum)
const books = [{
"id": "a6113b1cd5d4617f63bb10abc874bea7",
"times": [1, 5], // an array of numbers
"length": 1,
"rating": 4.77
}, {
"id": "b6113b1cd5d4617f63bb10abc874bea7",
"times": [8], // an array of numbers
"length": 1,
"rating": 2.6
}]
const result = sorting(books)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
我有一个对象,它有这样的数字数组对象:
books = [{
id: "a6113b1cd5d4617f63bb10abc874bea7",
times: [{
0: 1,
1: 5
}],
length: 1,
rating: 4.77,
}, {
id: "b6113b1cd5d4617f63bb10abc874bea7",
times: [{
0: 8
}],
length: 1,
rating: 2.6,
}]
我想添加 按时间排序,但这需要是该对象内所有元素的总和 - 在第一个对象的示例中它是 1+5=6第二个对象是 8,所以排序的最终结果是第一个对象,然后是第二个。这是我到目前为止所拥有的,但它是不完整的。你知道我如何得到数组的总和吗?
const timesSorting = R.ascend(R.path(['times']))
const sorting = R.sortWith([timesSorting])
sorting(books)
使用R.sortBy,因为您需要按单个属性 排序。创建一个获取 time
属性的函数,使用 R.chain
和 R.values
获取时间数组中所有值的数组,并对它们求和。
const { pipe, prop, chain, values, sum, sortBy} = R
const getTimesSum = pipe(prop('times'), chain(values), sum);
const sorting = sortBy(getTimesSum)
const books = [{"id":"a6113b1cd5d4617f63bb10abc874bea7","times":[{"0":1,"1":5}],"length":1,"rating":4.77},{"id":"b6113b1cd5d4617f63bb10abc874bea7","times":[{"0":8}],"length":1,"rating":2.6}]
const result = sorting(books)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>
如果times
始终是一个数组,其中包含具有数字索引的单个对象,您可以将times
简化为一个数字数组,然后求和会更容易:
const { pipe, prop, sum, sortBy } = R
const getTimesSum = pipe(prop('times'), sum);
const sorting = sortBy(getTimesSum)
const books = [{
"id": "a6113b1cd5d4617f63bb10abc874bea7",
"times": [1, 5], // an array of numbers
"length": 1,
"rating": 4.77
}, {
"id": "b6113b1cd5d4617f63bb10abc874bea7",
"times": [8], // an array of numbers
"length": 1,
"rating": 2.6
}]
const result = sorting(books)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>