【问题标题】:NodeJS/JS - Sorting based on another array + moving elements efficientlyNodeJS/JS - 基于另一个数组排序 + 有效移动元素
【发布时间】:2016-09-01 20:48:38
【问题描述】:

我有 2 个数组:

var one = ['da22', 'ye66', '17hy']

var two = [{publicID: 'da22', score: '2'}, {publicID: '17hy', score: '2'}, {publicID: 'ye66', score: '2'}]

我希望two 根据onepublicID 订购,所以应该是

two = [{publicID: 'da22', score: '2'}, {publicID: 'ye66', score: '2'}, {publicID: '17hy', score: '2'}]

NodeJS 中是否有内置方法来执行此操作?

我已经让它工作了,但是它不是很有效。我有一种方法可以将元素从一个索引移动到另一个我正在使用的moveFromTo(oldIndex, newIndex

for (var r=0; r<one.length; r++) {
              if (one[r] != two[r]['publicID']) {
                two.moveFromTo(one.indexOf(two[r]['publicID']), r)
                r=-1; continue;
              }
}

但是随着事情的发展而不得不使用r=-1——尽管有效——似乎并不是最好的想法。

任何想法都将不胜感激。

非常感谢。

【问题讨论】:

  • two 中的对象定义您希望发生的事情,而one 中没有匹配的publicID
  • @Makyen - 总会有一个匹配的对象
  • @Makyen - 错字已修复
  • 所以onetwo之间会有总是精确一一对应的关系吗?

标签: javascript node.js


【解决方案1】:

您可以使用 sort()indexOf() 来做到这一点

var one = ['da22', 'ye66', '17hy'];
var two = [{publicID: 'da22', score: '2'}, {publicID: '17hy', score: '2'}, {publicID: 'ye66', score: '2'}];

var result = two.sort(function(a, b) {
  return one.indexOf(a.publicID) - one.indexOf(b.publicID);
})

console.log(result)

您还可以从one 创建对象并按该对象排序。

var one = ['da22', 'ye66', '17hy'];
var two = [{publicID: 'da22', score: '2'}, {publicID: '17hy', score: '2'}, {publicID: 'ye66', score: '2'}];

var o = one.reduce((r, e, i) => {return r[e]=i, r}, {});

var result = two.sort(function(a, b) {
  return o[a.publicID] - o[b.publicID];
})

console.log(result)

【讨论】:

【解决方案2】:

我相信有一个更简单的解决方案。您需要通过这些数组元素的不同属性来同步两个数组中元素的顺序,而第一个(目标)数组保留其顺序。

为此,您可以减少two,并且对于应用了reduce函数的每个当前元素,将two的对应元素放在结果数组中的某个位置(又名total):

const one = ['da22', 'ye66', '17hy'];
const two = [{
  publicID: 'da22',
  score: '2'
}, {
  publicID: 'ye66',
  score: '2'
}, {
  publicID: '17hy',
  score: '2'
}];

const sortedTwo = two.reduce((total, current) => {
  total[one.indexOf(current.publicID)] = current; // <- some crazy stuff here

  return total;
}, []);

确保two 中的publicID 属性值和one 的值完全相同。

包含原始数组的速度和不变性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多