【问题标题】:Javascript re-index array based on index of anotherJavascript根据另一个索引重新索引数组
【发布时间】:2018-06-24 02:15:28
【问题描述】:

试图弄清楚。不能。我有 2 个数组,我想对其中一个数组的索引进行排序,以匹配其对象的索引。

数组 1 是这样的:

var arr1 = [
  {
   "name": "bobby",
   "occupation": "singer"
  },
  {
   "name": "mindy",
   "occupation": "artist"
  }
] 

和数组 2:

var arr2 = [
  {
   "name": "mindy",
   "hobby": "drawing"
  },
  {
   "name": "bobby",
   "hobby": "driving"
  }
]

重新索引哪个并不重要。关键是我有两个名字bobbymindy,我想重新排列其中一个数组,以便它们的索引与另一个匹配。

【问题讨论】:

  • 没有包含任何内容,因为我认为逻辑不合理。我尝试制作一个新数组并按索引推送。类似for (let xo = 0; xo < daborder.length; xo++){newarr.push(arr2[arr2.indexOf(arr1.name)]);}
  • 名称是否总是在两个数组中?

标签: javascript


【解决方案1】:

sortcompareFunction 一起使用。

在下面找到内联的 cmets。

var arr1 = [
  {
   "name": "bobby",
   "occupation": "singer"
  },
  {
   "name": "mindy",
   "occupation": "artist"
  }
] 

var arr2 = [
  {
   "name": "mindy",
   "hobby": "drawing"
  },
  {
   "name": "bobby",
   "hobby": "driving"
  }
]

// create intermediate array of arr2 names
arr2Names = arr2.map(x => x.name)

// use sort:
arr1 = arr1.sort((x,y) => arr2Names.indexOf(x.name) - arr2Names.indexOf(y.name))
console.log(arr1, arr2)

var arr2 = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
var arr1 = ['b', 'd', 'g', 'f', 'e', 'a', 'c']
console.log(arr1.sort((x,y) => arr2.indexOf(x)  - arr2.indexOf(y)))

【讨论】:

  • @Gerrit0 你是对的。我编辑了我的答案以更正 compareFunction。希望现在是正确的
  • 这看起来更好 - 我发现比较相当混乱,每次我在代码库中滚动它时可能会浪费时间,但它有效:)
  • 我同意,这需要一点时间才能理解发生了什么,但我不知道是否会有更易于理解/更简单的解决方案。我最大的抱怨是变量名(xy):P 通常排序使用 ab,所以除了变量名之外,这让我无缘无故地将其视为笛卡尔坐标.
【解决方案2】:

通常的 (?) 简短版本是 O(n2)(假设所有名称都是唯一的并且存在于两个数组中):

var arr1 = [ { "name": "bobby", "occupation": "singer" },
             { "name": "mindy", "occupation": "artist" } ]; 
var arr2 = [ { "name": "mindy", "hobby": "drawing" },
             { "name": "bobby", "hobby": "driving" } ];

var arr2 = arr1.map(a => arr2.find(b => a.name === b.name));

console.log( JSON.stringify(arr1).replace('},', '},\n ') );
console.log( JSON.stringify(arr2).replace('},', '},\n ') );

按名称对两个数组进行排序是O(n log n)

var arr1 = [ { "name": "bobby", "occupation": "singer" },
             { "name": "mindy", "occupation": "artist" } ]; 
var arr2 = [ { "name": "mindy", "hobby": "drawing" },
             { "name": "bobby", "hobby": "driving" } ];

arr1.sort((a, b) => a.name.localeCompare(b.name));
arr2.sort((a, b) => a.name.localeCompare(b.name));

console.log( JSON.stringify(arr1).replace('},', '},\n ') );
console.log( JSON.stringify(arr2).replace('},', '},\n ') );

最后,使用查找助手对象的 O(n) 版本:

var arr1 = [ { "name": "bobby", "occupation": "singer" },
             { "name": "mindy", "occupation": "artist" } ]; 
var arr2 = [ { "name": "mindy", "hobby": "drawing" },
             { "name": "bobby", "hobby": "driving" } ];

var lookup = arr2.reduce((r, v) => (r[v.name] = v, r), {});
var arr2 = arr1.map(v => lookup[v.name]);

console.log( JSON.stringify(arr1).replace('},', '},\n ') );
console.log( JSON.stringify(arr2).replace('},', '},\n ') );

【讨论】:

  • 用大O表示法,数字系数没有意义,所以把它去掉。否则,很好的答案。
  • @PatrickRoberts 我知道对于时间复杂度,系数没有意义,但是 2N 与 100N 对某人来说不是什么意思吗?起初,我想,是的,我明白为什么它不重要,但是当涉及到 微优化 时这不重要吗?
  • 在算法中,系数没有单位,所以它没有传达任何信息。这是否意味着“函数调用”、“代码行”、“汇编指令”、“位切换”,什么?如果你调用一个函数两次而不是一次,它仍然是同一个大 O。它不会改变复杂度,只会改变比例,所以一般会被忽略。
猜你喜欢
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
相关资源
最近更新 更多