Javascript-计算数组中的出现次数,但不更改顺序

时间:2018-07-17 09:43:25

标签: javascript arrays object

所以我有这段代码,该代码应该计算通过数组输入的数字的出现次数。

  let counts = {};

  for (let i = 0; i < arr.length; i++) {
    let num = arr[i];
    counts[num] = counts[num] ? counts[num] + 1 : 1;
  }

我不明白为什么要对我提供的输入进行排序? 例如,如果我在输出中输入[1,3,2],则我的对象说:

1:1 2:1 3:1

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用Map来维持顺序并渲染对象数组作为结果。

/**
* setCustomFontTypeSpan
* @param context
* @param source
* @param startIndex
* @param endIndex
* @param font
* @return
*/
public static SpannableString setCustomFontTypeSpan(Context context, String 
source, int startIndex, int endIndex, int font) {
      final SpannableString spannableString = new SpannableString(source);
      Typeface typeface = ResourcesCompat.getFont(context, font);
      spannableString.setSpan(new StyleSpan(typeface.getStyle()), 
      startIndex,endIndex,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}

String source = "Hello world";
SpannableString string = setCustomFontTypeSpan(context, source, 6, 
source.length(), R.font.open_sans_bold);
textView.setText(string);

答案 1 :(得分:0)

您正在使用对象来捕获结果,并且键没有隐式顺序-但是,正如您所发现的,它们对于整数键有效。

如果要保持顺序,也许使用具有属性的对象数组作为键和计数-但是,您将遇到寻找正确的项目以增加其计数的问题。

您可以使用一个数组来维持顺序,并使用一个对象来提供快速查找:

let result = {
   lookup: {},
   counts: []
};

var arr = [1,3,2]
for (let i = 0; i < arr.length; i++) {
  let num = arr[i];
  var item = result.lookup[num];
  if(!item){
       item = {key:num,count:0}
       result.counts.push(item);
       result.lookup[num] = item;
  }
  item.count++;
}


console.log(result.counts);