【问题标题】:Find changed position in 2 sorted JS objects在 2 个已排序的 JS 对象中查找更改的位置
【发布时间】:2019-04-07 02:28:26
【问题描述】:

我有 2 个带有 rank 的 JS 对象,需要找到已更改的位置。

// old data
var a = {
    0: {
        symbol: 'ABC',
        rank: '1'
    },
    1: {
        symbol: 'BCD',
        rank: '2'
    },
    2: {
        symbol: 'CDE',
        rank: '3'
    }
};

// new data
var b = {
    0: {
        symbol: 'BCD',
        rank: '1'
    },
    1: {
        symbol: 'ABC',
        rank: '2'
    },
    2: {
        symbol: 'CDE',
        rank: '3'
    }
};

对象b 包含与对象a 相同的符号,并且都按rank 排序。我需要找到所有symbols 的新职位。

在此示例中,a.0.symbolb.0.symbol 交换了位置。

我正在寻找一种解决方案来检测此更改并获取对象b 的所有symbols,其位置(键)高于对象a

higherRanked = ['BCD'];

【问题讨论】:

  • 请添加您尝试过的内容。

标签: javascript sorting filtering


【解决方案1】:

一种方法是为a 中的对象创建symbol -> rank 映射,然后过滤b 中具有更高等级的键。请注意,索引(对象的键)并不重要,因为您说它们都是按排名排序的:

var a = {
  0: {
    symbol: 'ABC',
    rank: '1'
  },
  1: {
    symbol: 'BCD',
    rank: '2'
  },
  2: {
    symbol: 'CDE',
    rank: '3'
  }
};

var b = {
  0: {
    symbol: 'BCD',
    rank: '1'
  },
  1: {
    symbol: 'ABC',
    rank: '2'
  },
  2: {
    symbol: 'CDE',
    rank: '3'
  }
};

var aRanks = Object.values(a).reduce((acc, curr) => {
  acc[curr.symbol] = parseInt(curr.rank);
  return acc;
}, {});

var higherRanked = Object.values(b)
                          .filter(s => parseInt(s.rank) < aRanks[s.symbol])
                          .map(s => s.symbol);
console.log(higherRanked);

这有时间复杂度O(|a| + |b|)

【讨论】:

  • 感谢您的回答。我认为这会奏效。它看起来很有趣,但是对于我对 JS 的理解水平来说,它太复杂了。我不确定您的解决方案是否有时间优势。也许我稍后会回来并跟进您的回答。
【解决方案2】:

基本上循环遍历ab 并找到在索引中排名更高的那些。

// old data
var a = {
    0: {
        symbol: 'ABC',
        rank: '1'
    },
    1: {
        symbol: 'BCD',
        rank: '2'
    },
    2: {
        symbol: 'CDE',
        rank: '3'
    }
};

// new data
var b = {
    0: {
        symbol: 'BCD',
        rank: '1'
    },
    1: {
        symbol: 'ABC',
        rank: '2'
    },
    2: {
        symbol: 'CDE',
        rank: '3'
    }
};

higher_ranked = []

Object.keys(b).forEach((b_index) => {
  const b_symbol = b[b_index].symbol 
  const a_index = Object.keys(a).find(index_a => a[index_a].symbol === b_symbol)
  if (b_index < a_index) higher_ranked.push(b_symbol)
})

console.log(higher_ranked)
// [ 'BCD' ]

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多