gpt4 book ai didi

javascript - 使用map和reduce获取对象数组

转载 作者:行者123 更新时间:2023-11-28 18:28:05 25 4
gpt4 key购买 nike

我有一个数组

var c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}];

我想使用reduce方法和map来获得以下结果:

result = [
{ name: "John", occurence: 2 },
{ name: "Tom", occurence: 1 }
]

这是我尝试过但仍未完全实现的尝试。 https://jsfiddle.net/joeSaad/up3ddfzz/

c = [{
name: 'John'
}, {
name: 'John'
}, {
name: 'Simon'
}];

var d = c.reduce((countMap, word) => {
countMap[word.name] = ++countMap[word.name] || 1;
return countMap
}, []);

var e = c.reduce((countMap, word) => {
q = [];
countMap[word.name] = ++countMap[word.name] || 1;
var p = {
name: word.name,
occurence: countMap[word.name]
}
q.push(p);
return q
}, []);

console.log(e);

非常感谢您的帮助。提前致谢

最佳答案

您使用reduce的方式肯定是正确的,但我会将计算分为两个不同的步骤

let c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}];

const pairs = o=> Object.keys(o).map(k=> [k, o[k]])

let count = c.reduce((acc, {name}) => {
if (acc[name] === undefined)
return Object.assign(acc, { [name]: 1 })
else
return Object.assign(acc, { [name]: acc[name] + 1 })
}, {})

var result = pairs(count).map(([name, occurences]) => ({name, occurences}))

console.log(result)
//=> [ { name: 'John', occurences: 2 }, { name: 'Tom', occurences: 1 } ]

<小时/>

您可以将这些行为抽象为这样的不同函数

// convert an object to [[key,value]] pairs
const pairs = o=> Object.keys(o).map(k=> [k, o[k]])

// count unique instances of a property value in an array of objects
const countBy = (prop, xs)=> {
return xs.reduce((acc, x)=> {
let y = x[prop]
if (acc[y] === undefined)
return Object.assign(acc, { [y]: 1 })
else
return Object.assign(acc, { [y]: acc[y] + 1 })
}, {})
}

// your data
let c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}]

// then chain it all together
let result = pairs(countBy('name', c)).map(([name, occurences]) => ({name, occurences}))

console.log(result)
//=> [ { name: 'John', occurences: 2 }, { name: 'Tom', occurences: 1 } ]

<小时/>

ES6 还提供 Map这对于进行这种计算非常有用。

这段代码对我来说读起来更好一些,并且语义上更正确一些。我们之前的代码正在做完全相同的事情,只是它使用的是普通对象。 Map是专门为这种key->value数据设计的数据结构,因此Map成为更好的选择。

唯一的问题是,如果您的代码库尚未以某种方式使用 map ,那么仅仅为此引入它们可能是错误的举动。

// convert a Map to an array of pairs
const mpairs = m=> [...m.entries()]

// countBy this time uses Map
const countBy = (prop, xs)=> {
return xs.reduce((m, x)=> {
let y = x[prop]
if (m.has(y))
return m.set(y, m.get(y) + 1)
else
return m.set(y, 1)
}, new Map)
}

// your data
let c = [{name: 'John'}, {name: 'John'}, {name: 'Tom'}]

// then chain it all together
let result = mpairs(countBy('name', c)).map(([name, occurences]) => ({name, occurences}))

console.log(result)
//=> [ { name: 'John', occurences: 2 }, { name: 'Tom', occurences: 1 } ]

关于javascript - 使用map和reduce获取对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38708948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com