我有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.symbol
和b.0.symbol
交换了职位。
我正在寻找一种解决方案,以检测此更改并获得对象symbols
中所有b
的位置(键)比对象a
中更高的位置。
higherRanked = ['BCD'];
答案 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)
基本上遍历a
和b
并找到索引中排名较高的人。
// 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' ]