Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从javascript对象获取唯一值并将其放入数组中_Javascript_Reactjs - Fatal编程技术网

从javascript对象获取唯一值并将其放入数组中

从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

我有一个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", 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]
  ), []);
}