如何对数组中仅包含数字值的元素进行排序?

5

变量points的值是[2, a, t, 5, 4, 3]; 排序后: 变量points的值是[2, a, t, 3, 4, 5]。

需要帮助吗?因为我正在进行Adobe DC项目,所以可能需要使用旧版JavaScript代码发布您的帮助。

我的代码在这里:

var points = [t1, t2, t3, t4];
[t1, t2, t3, t4] = points;

var lucky = points.filter(function(number) {
  return isNaN(number) == false && number !=="" && number!== undefined;
});
points=lucky
points.sort(function(a, b){return a - b});

this.getField("Text6").value = points

但是这样只能将最小值和最大值排序并过滤其他字符...我需要保留其他字符并仅缩短数字...

1
欢迎来到SO。我们的理念是你先展示你所尝试过的,然后我们再提供帮助。 - Mitya
不展示代码的情况下,我可以建议将数组拆分并单独排序,然后再合并。 - Abhay Maurya
4个回答

3

var points = [2, "a", "t", 5, 4, 11, "", 3];
var insert = points.slice(0); // Clone points

// Remove all elements not a number
points = points.filter(function(element) {
  return typeof element === 'number';
});

// Sort the array with only numbers
points.sort(function(a, b) {
  return a - b;
});

// Re-insert all non-number elements
insert.forEach(function(element, index) {
  if (typeof element !== 'number') {
    points.splice(index, 0, element);
  }
});

console.log(points);


2
不错。实际上,考虑到有多少回答者(包括我自己)都回答错误,这看起来像是一个不错的面试问题,可以在未来使用。 - ՕլՁՅԿ
我同意@pete的看法,它看起来非常简单。 - Mark
2
为什么只使用 sort(),它不适用于更大的数字。 - Maheer Ali
1
@Armel 我发现的一个错误是太短和 "" 值... 并且不保留表位置,如何修复? - hacker tom
@MaheerAli 没错,我已经在 sort() 中添加了一个比较函数。 - Pingolin
@hackertom,我已经解决了空字符串“”,谢谢。 - Pingolin

2
你可以通过避免使用splice()函数并直接在原地重新赋值来更高效地完成此操作。
先进行筛选和排序,然后重新赋值以在原地排序数字:

let arr = ['c', 2, 'a', 't', 5, 4, 3, 'b', 1]

let n = arr.filter(c => typeof c == "number").sort((a, b) => a-b)
for (let i = 0, c=0; i<arr.length; i++){
    if (typeof arr[i] == "number") arr[i] = n[c++]
}
console.log(arr)


1
我喜欢你的简洁解决方案,但我保留了一些更冗长且不太 ES6 的东西。我猜这取决于你想要什么 ;) 谢谢。 - Pingolin

1

filter() numbers out of array. Then sort() them and then loop through real array. And check if value is Number change it will first element of sorted array. And remove first element of sortedArr

let arr = [5, 't', 's', 2,3,4];
let sortedNums = arr.filter(x => typeof x === 'number').sort((a,b) => a-b);
arr.forEach((a,i) => {
  if(typeof a === 'number'){
    arr[i] = sortedNums[0]
    sortedNums.shift();
  } 
})

console.log(arr)


1
@MarkMeyer ‍♂️ 真的 - ՕլՁՅԿ

0
以下内容应该会根据您的输入给出精确的输出:

var result = [2, 'a', 't', 5, 4, 3].reduce(
  function(result,item){
    return !isNaN(item)&&item!==''
      ? typeof (result[result.length-1] && result[result.length-1].push) === 'function'
        ? (result[result.length-1].push(item),result)
        : result.concat([[item]])
      : result.concat(item)
  },
  []
).map(
  function(item){
    return typeof item.sort === 'function'
      ? item.sort(function(a,b){return a-b})
      : item
  }
).reduce(
  function(result,item){
    return result.concat(item)
  },[]
);

console.log(result);


我理解这个问题的方式是将所有数字作为一个整体进行排序,而不是对数字子组进行排序。例如,[2, 'a', 't', 5, 4, 3, 1] 的期望输出应该是 [1, 'a', 't', 2, 3, 4, 5]。上面的代码返回 [ 2, 'a', 't', 1, 3, 4, 5 ] - Mark
@MarkMeyer 也有可能是这样的情况。 - HMR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接