【发布时间】:2018-12-06 14:03:11
【问题描述】:
我需要一些关于getting duplicate Object from the Object 的帮助,我一直卡住。
举例
My Object = {1: 'cat', 2: 'dog', 3: 'cat'}
预期结果应该是
{1: 'cat'}
【问题讨论】:
标签: javascript angularjs underscore.js lodash
我需要一些关于getting duplicate Object from the Object 的帮助,我一直卡住。
举例
My Object = {1: 'cat', 2: 'dog', 3: 'cat'}
预期结果应该是
{1: 'cat'}
【问题讨论】:
标签: javascript angularjs underscore.js lodash
使用类似的东西,
var answers = {1: 'cat', 2: 'dog', 3: 'cat'}
var keys = Object.keys(answers);
var dupe = {};
for(var i=0;i<keys.length;i++){
for(var j=i+1;j<keys.length;j++){
if(answers[keys[i]] === answers[keys[j]]){
dupe[keys[i]] = answers[keys[i]];
}
}
}
console.log(dupe)
【讨论】:
您可以使用映射计算出现次数,并获取结果集的第一个找到的键/值对。
var object = { 1: 'cat', 2: 'dog', 3: 'cat' },
result = Object.assign(
...Array.from(
Object
.entries(object)
.reduce((m, [k, v]) => (([l, c]) => m.set(v, [l, c + 1]))(m.get(v) || [k, -1]), new Map),
([v, [k, c]]) => c && { [k]: v }
)
);
console.log(result);
【讨论】:
使用 lodash,您可以将对象转换为对数组,按值对它们进行分组,并删除不重复的组,然后再转换回数组:
const object = { 1: 'cat', 2: 'dog', 3: 'cat' }
const fn = _.flow([
_.toPairs, // convert to pairs [key, value]
o => _.groupBy(o, _.last), // group the pairs by the value
o => _.filter(o, g => g.length > 1), // filter out group with no duplicates
o => _.map(o, _.first), // get the 1st item from each group
_.fromPairs // convert back to object
])
const result = fn(object)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
【讨论】:
这是另一个基于Array.reduce的实现:
const o = { 1: 'cat', 2: 'dog', 3: 'cat' }
const result = Object.entries(o).reduce((r, [k,v], idx, arr) => {
r[v] = [...(r[v] || []), { [k]: v }]
return idx == arr.length-1 ? Object.values(r).find(x => x.length > 1)[0] : r
}, {})
console.log(result)
这里有更多细节:
const object = { 1: 'cat', 2: 'dog', 3: 'cat' }
const result =
Object.entries(object) // get object key & value in the form of [key,value]
.reduce((accumulator, [k,v], index, array) => { // start an `Array.reduce`
// create the grouping on the value `cat`/`dog`
accumulator[v] = [...(accumulator[v] || []), { [k]: v }]
if(index == array.length-1) // if we are at the end of the `Array.reduce`
// Return the values of the accumulator filtered by the arrays which length is more than 1
// and take from that array the initial element
return Object.values(accumulator).find(x => x.length > 1)[0]
else // Not at the end keep returning the accumulator
return accumulator
}, {})
console.log(result)
【讨论】: