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"] 所以我试过了,

我一直在尝试解决我遇到的一个在线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 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'