Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.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_Arrays_Api - Fatal编程技术网

创建JavaScript对象而不重复

创建JavaScript对象而不重复,javascript,arrays,api,Javascript,Arrays,Api,我试图创建一个应该由PHPAPI处理的JavaScript对象 应该是这样的: [{ 'targetId': 'roof', 'color': 'red' }, { 'targetId': 'window', 'color': 'green' }] 这些值应在用户输入时生成,例如,每当用户单击一个名为“roof”的元素时,它将循环通过一些颜色,与“window”相同(+多个其他颜色) 我现在得到的是: let requestJSON=[] 让超时=未定义 myElement.a

我试图创建一个应该由PHPAPI处理的JavaScript对象

应该是这样的:

[{
  'targetId': 'roof',
  'color': 'red'
},
{
  'targetId': 'window',
  'color': 'green'
}]
这些值应在用户输入时生成,例如,每当用户单击一个名为“roof”的元素时,它将循环通过一些颜色,与“window”相同(+多个其他颜色)

我现在得到的是:

let requestJSON=[]
让超时=未定义
myElement.addEventListener('click',函数(e){
设target=e.target;
设targetID=target.id
让颜色=颜色[getNumber(e.target)]
target.setAttribute('fill',color)
设thisJSON=
{
“targetId”:targetId,
“颜色”:颜色
}
updateRequest(thisJSON)
})
函数更新请求(输入){
如果(超时!=未定义)clearTimeout(超时)
push(输入)
超时=设置超时(()=>{
log(requestJSON)
//makeRequest(requestJSON)
}, 1000);
}
函数makeRequest(body){
body=JSON.stringify(body)
取('https://myapi.com/setcolor', {
身体:身体,,
方法:“发布”
})
。然后((res)=>{
返回console.log(res.json())
})
.catch((错误)=>{
控制台错误(错误)
})
}
目前,这将多次将同一元素推送到JavaScript对象,即使它已经存在

我需要实现的是,JavaScript对象中不应该有任何重复值:在将元素推送到数组之前,函数应该检查
targetId
是否已经存在,并且只更新相应的值

这里的正确方法是什么?提前谢谢

您可以使用检查具有给定
targetId
的对象是否已存在。因此,对
更新请求(输入)
进行以下更改:


Array#find
在这里可能很有用。给定正确的回调,它将找到具有匹配的
targetId
,然后您可以直接更新该对象(例如
match.color=color;
),因为该对象将通过引用进行更新。如果未找到
match
,可以通过将其添加到数组中来处理这种情况。首先,thisJSON不是JSON,而是Javascriptobject@Liam绝对正确@NiettheDarkAbsol会试试的,谢谢!这几乎就是我想要的。当元素已经存在时,它会跳过该元素,但我希望它用一个新值更新,而不是更新答案,谢谢!另一种方法是使用
findIndex
,如下所述
function updateRequest(input) {
    if (timeout != undefined) clearTimeout(timeout)
    let obj = requestJSON.find(elem=>elem.targetId === input.targetId)
    // If targetId already exists in requestJSON, update color, else push
    if(obj)
        obj.color = input.color
    else
        requestJSON.push(input)
    timeout = setTimeout(() => {
        console.log(requestJSON)
        // makeRequest(requestJSON)
    }, 1000);
}