我有一个像这样的数组:
"test": {
"builder: "@angular-devkit/build-angular:karma",
"options": {
...
},
"configurations": {
"production": {
...
}
}
}
我想获取映射到此的数组编号:
let array = [14, 42, 1, 3]
这是原因:
[1, 0, 3, 2]
:因为1
是第二大数字14
:因为0
是最大的数字42
:... 到目前为止,我已经尝试过:
3
答案 0 :(得分:9)
您可以获取索引并通过从给定数组中获取值对它们进行排序。
const sort = array => [...array.keys()].sort((a, b) => array[b] - array[a]);
console.log(sort([14, 42, 1, 3]));
console.log(sort([14, 42, 14, 3]));
答案 1 :(得分:2)
这是因为indexOf在找到第一个结果时停止。
您可以尝试在首次找到该值时将其更改为null,或者将其与结果中已有的值进行比较,然后忽略这些值。
let sort = (array) => {
let result = []
let x = array.slice(0).sort((a, b) => b - a)
for (let elem of x) {
result.push(array.indexOf(elem))
array[array.indexOf(elem)] = null;
}
console.log(result)
}
答案 2 :(得分:0)
let sort = (arr) => {
let arr2 = arr.slice().sort((a, b) => b - a);
return arr.map((val) => {
return arr2.indexOf(val);
})
}
console.log(sort([14, 42, 1, 3]));
答案 3 :(得分:0)
您可以使用跟踪器对象,映射值和索引作为key/value
对,并在循环array
时从相应键中获取第一个索引并将其移位
let sort = (array) => {
let result = []
let x = array.slice(0).sort((a, b) => b - a)
let tracker = x.reduce((op,inp,i)=>{
op[inp] = op[inp] || []
op[inp].push(i)
return op
},{})
for (let elem of array) {
let val = tracker[elem][0]
tracker[elem].shift()
result.push(val)
}
console.log(result)
}
sort([14, 42, 1, 3]) // working
sort([14, 42, 14, 3]) // includes the index "0" two times
答案 4 :(得分:0)
(() => {
function getBiggestOrder (nums) {
const lookup = {}
const result = nums.slice(0).sort((a, b) => b - a).map((num, i) => {
lookup[num] = i
return num
})
return nums.map(n => lookup[n])
}
const op = getBiggestOrder([14, 42, 1, 3])
console.log(op)
return op
})()
答案 5 :(得分:0)
您基本上是在按从大到小的顺序编号。将它们按从大到小的重复数组排序。并将原始数组编号替换为重复数组中的索引。
Original = [14, 42, 1, 3]
Duplicate = [42, 14, 3, 1]
Duplicate indexes are [0, 1, 2, 3]
因此在第一个数组中找到42,然后用重复数组中42的索引替换它,等等。