【问题标题】:Merge and sort two object arrays in Javascript在Javascript中合并和排序两个对象数组
【发布时间】:2017-12-28 04:25:34
【问题描述】:

我有两个数组,根据元素在数组中的位置,它会接收一个值。两个数组都包含相同的元素,但位置不同。我想计算每个元素的值,将数组合并为一个数组,并对新数组进行排序。

我能想到的唯一想法是将我的初始数组转换为对象数组,合并它们,按对象值排序,然后将该顺序映射到一个新数组中。

var ranks = [],
    objArray1 = [],
    objArray2 = [];

// 'aaa' = 5, 'bbb' = 4, 'ddd' = 3, 'eee' = 2, 'ccc' = 1
var array1 = ['aaa', 'bbb', 'ddd', 'eee', 'ccc'];

// 'ddd' = 5, 'ccc' = 4, 'aaa' = 3, 'bbb' = 2, 'eee' = 1
var array2 = ['ddd', 'ccc', 'aaa', 'bbb', 'eee'];

for (var i = 0, x = 5; i < 5; x--, i++) {
  var obj = {};
  obj[array1[i]] = x;
  objArray1.push(obj);
}

for (var i = 0, x = 5; i < 5; x--, i++) {
  var obj = {};
  obj[array2[i]] = x;
  objArray2.push(obj);
}

// combine both object arrays, match keys, but add values
// should output ranks =[{aaa: 8}, {bbb: 6}, {ccc: 5}, {ddd: 8}, {eee: 3}]

// then sort based on value
// should output ranks = [{aaa: 8}, {ddd: 8}, {bbb: 6}, {ccc: 5}, {eee: 3}]

// then copy keys over to new array while keeping position
// should output var final = ['aaa', 'ddd', 'bbb', 'ccc', 'eee']

【问题讨论】:

  • 这看起来像是作业/面试问题?
  • 您只想按两个数组的总和对元素进行排序?
  • 预期结果是什么?

标签: javascript arrays sorting


【解决方案1】:

您可以跳过带有对象的新临时数组的部分,只取一个对象进行计数,然后将排序后的键作为结果。

var array1 = ['aaa', 'bbb', 'ddd', 'eee', 'ccc'],
    array2 = ['ddd', 'ccc', 'aaa', 'bbb', 'eee'],
    temp = Object.create(null),
    result;

[array1, array2].forEach(a => a.forEach((k, i) => temp[k] = (temp[k] || 0) - i));
result = Object.keys(temp).sort((a, b) => temp[b] - temp[a]);

console.log(result);

【讨论】:

  • 嘿,这真是太聪明了!非常感谢!我正在研究的解决方案只是一堆乱七八糟的循环,这更干净。
【解决方案2】:

您可以使用reduce 创建对象,然后在Object.keys 上使用sort

const array1 = ['aaa', 'bbb', 'ddd', 'eee', 'ccc'];
const array2 = ['ddd', 'ccc', 'aaa', 'bbb', 'eee'];
const n = array1.length;

const r = array1.reduce((r, e, i) => (r[e] = n - i + n - array2.indexOf(e), r), {})
const result = Object.keys(r).sort((a, b) => r[b] - r[a])
console.log(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-17
    • 2013-01-17
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多