在2个排序的JS对象中查找更改的位置

时间:2018-11-02 20:28:46

标签: javascript sorting filtering

我有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交换了职位。

我正在寻找一种解决方案,以检测此更改并获得对象symbols中所有b的位置(键)比对象a中更高的位置。

higherRanked = ['BCD'];

2 个答案:

答案 0 :(得分:2)

一种方法可以是为symbol -> rank中的对象创建a映射,然后过滤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 |)

答案 1 :(得分:1)

基本上遍历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' ]