Javascript 根据数组中元素的数量和对元素进行排序
我一直在尝试解决我遇到的一个在线Javascript挑战。所以,问题是这样的 我有一个数组Javascript 根据数组中元素的数量和对元素进行排序,javascript,data-structures,Javascript,Data Structures,我一直在尝试解决我遇到的一个在线Javascript挑战。所以,问题是这样的 我有一个数组 let strng="103 123 4444 99 2000" 所以我必须根据单个元素的总和按升序排列它们,比如 103=1+0+3=4 123=1+2+3=6 4444=4+4+4+4=16 99=9+9=18 2000=2+0+0+0=2 因此,现在根据结果,strng数组中的元素需要按升序排序 最后的答案应该是 ["2000" "103" "123" "4444" "99"] 所以我试过了,
let strng="103 123 4444 99 2000"
所以我必须根据单个元素的总和按升序排列它们,比如
103=1+0+3=4
123=1+2+3=6
4444=4+4+4+4=16
99=9+9=18
2000=2+0+0+0=2
因此,现在根据结果,strng数组中的元素需要按升序排序
最后的答案应该是
["2000" "103" "123" "4444" "99"]
所以我试过了,我完全不知道下一步是什么
下面是我的代码
let s=[]
let f=strng.split(' ')
console.log(f)
f.map(item=>{
let d=item.split('').reduce((a,b)=>Number(a)+Number(b),0)
s.push(d)
s.sort((a,b)=>a-b)
})
console.log(s) // gives me [2, 4, 6, 16, 18]
所以我已经根据单个元素的数字之和对它们进行了排序,但是现在我应该如何在strng数组中排列元素呢?
我需要通过按升序排序返回strng数组。因此,作为一名初学者,我想问下一步该怎么做?我在这里完全被绊住了。以下是我的解决方案:
const string = "103 123 4444 99 2000".split(' ');
const sumString = (str) => str.split('').reduce((s, c) => s + Number(c), 0)
string.sort((a, b) => {
return sumString(a) - sumString(b);
});
console.log(string); //["2000", "103", "123", "4444", "99"]
您的一般方法很好,但是不要使用
map
,而是使用sort
。这就是它的目的。:-)我也可能会给自己一个sumdights
函数:
function sumDigits(str) {
return str.split("").reduce((s, v) => s + Number(v), 0);
}
然后,sort
大致是(array
是原始字符串上的split(“”
)的结果):
然后,您可能需要通过.join(“”
)将结果连接回单个字符串
请注意,我并不是故意提供完整的联合解决方案,因为我的感觉是您需要帮助解决这个问题,而不是将解决方案交给您。:-) 您可以将问题分解为更小的部分,例如一个函数用于获取和,或者一个函数用于存储给定字符串的和,以防止对同一字符串求和 最后使用预先计算的总数进行排序
let sum=s=>Array.from(s,Number).reduce((a,b)=>a+b,0),
字符串=[“103”、“321”、“123”、“4444”、“99”、“2000”、“20”],
sums=字符串。reduce((m,s)=>m.set(s,sum(s)),新映射);
strings.sort((a,b)=>sums.get(a)-sums.get(b));
console.log(字符串)代码>可能是这样的:
让strng=“103 123 4444 99 2000”;
变量字符串=标准拆分(“”);
for(字符串中的var键){
var cur_str=string_arr[key_sa];
变量cur_str_arr=cur_str.split(“”);
var cur_str_sum=0;
用于(当前结构中的var键csa){
cur_str_sum+=parseInt(cur_str_arr[key_csa])|0;
}
console.log(cur_str_sum);
}
请检查下面的代码片段。这可能会有帮助
函数排列数{
函数getSum(num){
返回num.split(“”).map(n=>parseInt(n)).reduce((acc,curr)=>acc+curr,0);
}
返回s.split(“”).sort((a,b)=>getSum(a)-getSum(b)).join(“”);
}
设strng=“103 321 123 4444 99 2000 20”;
console.log(arrangeNums(strng))代码>代码的功能样式
str.split(/\s+/)
.map(a => [a,
a.split('')
.reduce((acc, b) => acc + Number(b), 0)])
.sort((a, b) => a[1] - b[1])
.map(e => e[0])
let str=“103 321 123 4444 99 2000 20”
设res=str.split(/\s+/)
.map(a=>[a
,a.split(“”)
.减少((acc,b)=>acc+编号(b),0)
])
.sort((a,b)=>a[1]-b[1])
.map(e=>e[0])
console.log(res)
我的2美分(忍者代码?)
这个想法产生了,我最终意识到“321”和“123”是同一个数字(6)
“4444”和“88”甚至“2000”和“2”也是如此。…
在这些平等的情况下,有必要维护自然秩序
i、 e:
const sum=s=>[…s].reduce((t,x)=>t+(+x),0)
,sortStrArray=s=>s.split(“”).sort((a,b)=>{r=sum(a)-sum(b);return(r?r:(+a)-(+b))}.join(“”)
;
常量值=['103 123 4444 99 20'
, '2000 99 123 4444 2'
, '321 4444 123 88 99'
];
//打样(飞贼跑)
values.forEach(val=>console.log(`sortStrArray('${val}')->'${sortStrArray(val)}')`))
.as控制台包装{max height:100%!important;top:0;}
让strng=[“103”“123”“4444”“99”“2000”]
是一个语法错误。你是在做一个有五个条目的数组,还是别的什么?实际上这就像让strng=“103 123 4444 99 2000”一样,所以我做了strng.split(“”)来转换为数组。我改变了答案,现在,当数字的和相等时,它保持了自然顺序。321
/312
/123
哪一个先到?@Ratnabhkumarray我更改了我的答案,我在一个函数(名为sortStrArray)中做了它
str.split(/\s+/)
.map(a => [a,
a.split('')
.reduce((acc, b) => acc + Number(b), 0)])
.sort((a, b) => a[1] - b[1])
.map(e => e[0])
sortStrArray('103 123 4444 99 20') -> '20 103 123 4444 99'
sortStrArray('2000 99 123 4444 2') -> '2 2000 123 4444 99'
sortStrArray('321 4444 123 88 99') -> '123 321 88 4444 99'