从javascript对象获取唯一值并将其放入数组中
我有一个JS对象,它被构建为以下props.moves:从javascript对象获取唯一值并将其放入数组中,javascript,reactjs,Javascript,Reactjs,我有一个JS对象,它被构建为以下props.moves: 0: {userId: 168, moveId: 198, moveName: "FirstSettlementMove", building: {…}} 1: {userId: 168, moveId: 200, moveName: "FirstSettlementMove", building: {…}} 2: {userId: 168, moveId: 202, moveName: "FirstSettlementMove", bu
0: {userId: 168, moveId: 198, moveName: "FirstSettlementMove", building: {…}}
1: {userId: 168, moveId: 200, moveName: "FirstSettlementMove", building: {…}}
2: {userId: 168, moveId: 202, moveName: "FirstSettlementMove", building: {…}}
3: {userId: 168, moveId: 204, moveName: "FirstSettlementMove", building: {…}}
4: {userId: 168, moveId: 206, moveName: "FirstSettlementMove", building: {…}}
我想写一个特定的函数,它遍历这个对象的所有元素,从0到最后一个元素。然后,它应该检查moveName中的值,将所有唯一的值放入一个数组并返回该数组。基本上是这样的:
function moveCollector(props.moves) {
let arr = [];
for (key=="moveName" in props.moves)
add every unique value to arr
}
有人对此有办法或解决方案吗?对于具有唯一值的部分以及一个对象元素具有各种键的事实,我尤其一无所知
提前谢谢
let moves=[
{userId:168,moveId:198,moveName:“FirstSettlementMove”},
{userId:168,moveId:200,moveName:“FirstSettlementMove”},
{userId:168,moveId:202,moveName:“FirstSettlementMove”},
{userId:168,moveId:204,moveName:“FirstSettlementMove”},
{userId:168,moveId:206,moveName:“FirstSettlementMove”}
]
函数moveCollector(移动){
let unique=[]
moves.forEach((move)=>{
如果(!unique.includes(move.moveName)){
唯一的.push(move.moveName);
}
})
返回唯一值;
}
log(“移动的唯一名称:”,moveCollector(moves))
另一种方式,适用于喜欢一行代码的人:)
您可以使用reduce()
创建名称为键的对象并读取键:
let names=Object.keys(list.reduce)(acc,v)=>{
acc[v.moveName]=1;
返回acc;
}, {}))
list=[{userId:168,moveId:198,moveName:“FirstSettlementMove”},
{userId:168,moveId:200,moveName:“FirstSettlementMove”},
{userId:168,moveId:202,moveName:“FirstSettlementMove”},
{userId:168,moveId:204,moveName:“FirstSettlementMove”},
{userId:168,moveId:206,moveName:“FirstSettlementMove”}]
让name=Object.keys(list.reduce)(acc,v)=>{
acc[v.moveName]=1;
返回acc;
}, {}))
console.log(名称)代码>从一个稍微简单一点的问题开始,然后逐步解决可能会更容易。假设我们要编写一个函数unique
,它接受一个数字数组,并生成另一个数字数组,其中包含输入数组中每个唯一值中的一个。即:
//*一厢情愿*
唯一([1,3,1,1,2,3,4,3,4])
// => [1, 3, 2, 4]
一种方法是迭代输入数组,维护我们到目前为止看到的数字数组。对于每个数字,如果我们还没有看到它,我们将其添加到数组中;否则,我们继续前进。下面是它的样子
function unique(nums) {
const seen = [];
for (let num of nums) {
if (!seen.includes(num)) {
seen.push(num);
}
}
return seen;
}
现在,为了回答您的问题,我们需要以一种关键方式修改此函数:为了测试是否应将一个对象添加到seed
数组,我们需要查看是否已看到另一个具有相同moveName
值的对象。我们可以使用以下方法完成此任务:
如果我没有提到,这也可以通过以下方法实现:
有些人喜欢这样;其他人对此深恶痛绝。。forEach会更好。mapTypeError:moves.forEach不是我得到的函数实际上有人建议我这样做,你可以用map替换它,但两者都应该这样做work@KarimAbouElNaga这与问题无关。您可能在其他地方获取数据,因此添加一个检查以避免在加载数据时使用它:例如,if(props.moves)
。这不起作用。它抛出一个错误,因为您没有返回acc
,并且includes
在acc
每次迭代时都会被调用。这是否回答了您的问题?另外,请参见Jason Goemaat的回答。它相当聪明(而且可能快得多)。
function unique(nums) {
const seen = [];
for (let num of nums) {
if (!seen.includes(num)) {
seen.push(num);
}
}
return seen;
}
function unique(objs) {
const seen = [];
for (let obj of objs) {
if (!seen.find(({ moveName }) => moveName === obj.moveName)) {
seen.push(obj);
}
}
return seen;
}
function unique(objs) {
return objs.reduce((acc, obj) => (
acc.find(({ moveName }) => obj.moveName === moveName)
? acc
: [...acc, obj]
), []);
}