【问题标题】:How to sort 2nd array by sorting the 1st one using Javascript or JQuery?如何通过使用 Javascript 或 JQuery 对第一个数组进行排序来对第二个数组进行排序?
【发布时间】:2016-10-07 07:39:08
【问题描述】:

我有 2 个数组。我只想对第一个数组进行排序,第二个数组应该在第一个数组的基础上做短。

排序前:

arrTexts = ["Company", "Department", "Account"];
arrValue = ["nameCompany", "department", "account"];

做空后应该是这样的:

arrTexts = ["Account", "Company", "Department"];
arrValue = ["account", "nameCompany", "department"];

我知道按arrTexts.sort(); 排序,但在上述情况下它不是那么有用。

请注意数组长度不能超过 300。所以,性能(分拣速度)也很重要。

有人可以推荐我吗?

【问题讨论】:

  • 请添加有效的 JavaScript 数组。 缩短是什么意思?
  • 为什么第二个数组不能像第一个那样排序?..你能举一个更好的例子吗?请按照尼娜说的去做。使用 [ ] 而不是 { }
  • 如果所有元素都只是字符串,您的排序方法将如何知道公司的名称、描述、帐户是什么?
  • 它不是一个数组。它是一个对象。一个有效的数组应该包含在[] 中,例如var arr = ['a', 'b']
  • 为什么nameCompanydeparment 之前和account 之后?没有逻辑。

标签: javascript jquery arrays sorting


【解决方案1】:

下面是一些开始使用的代码。

var arrTexts = [
  "Company", "Department", "Account"
];

var arrValue = [
  "nameCompany", "department", "account"
];

var sortedArr1 = arrTexts.sort();

var sortedArr2 = [];

sortedArr1.forEach(function(v, i) {
  var t = arrValue.find(function(_v) {
    return _v.toLowerCase().indexOf(v.toLowerCase()) > -1;
  });
  sortedArr2.push(t);
});

console.log(sortedArr1);
console.log(sortedArr2);

【讨论】:

  • 我已经尝试了所有解决方案。所有解决方案中最快的。谢谢
【解决方案2】:

这是一种方法:

arrTexts = ["Company", "Department", "Account"];
arrValues = ["nameCompany", "department", "account"];


arrTextsValues = {};
arrTexts.forEach(function(item, key){
    arrTextsValues[item] = arrValues[key];
})

arrTextsSorted = arrTexts.sort();
arrValuesSorted = [];

arrTextsSorted.forEach(function(item){
    arrValuesSorted.push(arrTextsValues[item]);
})

console.log(arrTextsSorted, arrValuesSorted);

它输出这个:

[ 'Account', 'Company', 'Department' ] 
[ 'account', 'nameCompany', 'department' ]

首先我创建一个对象,该对象将保存文本和值之间的对应关系,然后我对文本进行排序,最后,我循环排序的文本以创建一个数组,根据之前创建的对应对象以正确的顺序保存值.

希望这会有所帮助。

我不知道它是否能满足您对性能问题的需求。这是你的发现:)

【讨论】:

    【解决方案3】:

       var arrTexts = ["Company", "Department", "Account"];
       var arrValue = ["nameCompany", "department", "account"];
        
        
        // temporary array holds objects with position and sort-value
        var mapped = arrTexts.map(function(el, i) {
          return { index: i, value: el };
        })
        
        // sorting the mapped array containing the reduced values
        mapped.sort(function(a, b) {
          return +(a.value > b.value) || +(a.value === b.value) - 1;
        });
        
        // container for the resulting order
        var result = mapped.map(function(el){
          return arrValue[el.index];
        });
        console.log(result);

    【讨论】:

      【解决方案4】:

      您可以将索引用作临时数组并使用arrTexts 的值对其进行排序。然后将结果映射到arrValue

      var arrTexts = ["Company", "Department", "Account"],
          arrValue = ["nameCompany", "department", "account"],
          indices = arrTexts.map(function (_, i) { return i; }),
          values,
          texts;
      
      indices.sort(function (a, b) { return arrTexts[a].localeCompare(arrTexts[b]); });
      texts = indices.map(function (i) { return arrTexts[i]; });
      values = indices.map(function (i) { return arrValue[i]; });
      
      console.log(values);
      console.log(texts);

      【讨论】:

      • 如果第二个数组的顺序与第一个数组的顺序相同,此解决方案可能不起作用!!
      • @Pugazh,为什么不呢?我只排序indices,而不是原始数组,然后根据索引构建一个新数组。
      猜你喜欢
      • 2016-11-05
      • 2020-08-01
      • 2020-11-19
      • 1970-01-01
      • 2021-11-11
      • 2018-11-18
      • 2022-12-11
      • 1970-01-01
      • 2021-11-01
      相关资源
      最近更新 更多