Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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_Object - Fatal编程技术网

Javascript 检查对象的属性是否存在,并且只更新另一个属性

Javascript 检查对象的属性是否存在,并且只更新另一个属性,javascript,arrays,object,Javascript,Arrays,Object,我有一个数组,其中的对象如下所示: let arr = [ { taxonomy: 'category', id: [ 10, 100 ] }, { taxonomy: 'post_tag', id: [ 20 ] }, ]; const object = { taxonomy: 'category', id: 30 } 我希望能够在数组中推送一个新对象,如下所示: let arr = [

我有一个数组,其中的对象如下所示:

    let arr = [
        { taxonomy: 'category', id: [ 10, 100 ] },
        { taxonomy: 'post_tag', id: [ 20 ] },
    ];
    const object = {
        taxonomy: 'category',
        id: 30
    }
我希望能够在数组中推送一个新对象,如下所示:

    let arr = [
        { taxonomy: 'category', id: [ 10, 100 ] },
        { taxonomy: 'post_tag', id: [ 20 ] },
    ];
    const object = {
        taxonomy: 'category',
        id: 30
    }
我想要的是检查数组中属性值为“taxonomy”的对象是否已经存在,如果已经存在,我只想将新对象的id添加到现有对象中。我知道如何检查属性是否已经存在,但我不知道如何将新id添加到数组中

因此,添加上述对象将生成此数组:

    [
        { taxonomy: 'category', id: [ 10, 100, 30 ] }, // 30 is added
        { taxonomy: 'post_tag', id: [ 20 ] },
    ];
如果它还不存在,应该添加它。 有人能帮我吗?

使用
Array.find()
在数组中查找具有相同分类法的对象。如果存在,请将
id
添加到它。如果没有,请将对象的克隆推入阵列(将对象的
id
转换为阵列后):

const addUpdate=obj=>{
const current=arr.find(o=>obj.taxonomy===o.taxonomy);
如果(当前)当前id推送(对象id);
否则推({
…obj,
id:[对象id]
})
};
常数arr=[
{taxonomy:'category',id:[10100]},
{分类法:'post_tag',id:[20]},
];
addUpdate({taxonomy:'category',id:30});
addUpdate({taxonomy:'other',id:50});

控制台日志(arr)
您可以找到数组,并将id为
as array的新对象更新或推送到数组中

const
数组=[{taxonomy:'category',id:[10100]},{taxonomy:'post_tag',id:[20]}];
对象={taxonomy:'category',id:30},
item=array.find(({taxonomy})=>object.taxonomy===taxonomy);
如果(项目){
item.id.push(object.id);
}否则{
array.push(Object.assign({},Object,{id:[Object.id]}));
}
console.log(数组);
//卸下最后一个插件
//查找具有分类法和id的项
item=array.find({taxonomy,id})=>object.taxonomy===taxonomy&&id.includes(object.id));
//使用索引从id中删除
如果(项目)项目id.splice(项目id.indexOf(对象id)),则为1;
console.log(数组)

.as console wrapper{max height:100%!important;top:0;}
您可以使用函数
forEach
循环和推送新id

let arr=[{taxonomy:'category',id:[10100]},{taxonomy:'post_tag',id:[20]},],
object={taxonomy:'category',id:30};
arr.forEach(({taxonomy,id})=>{
if(object.taxonomy===分类法){
id.push(object.id);
}   
});
控制台日志(arr)使用下面的
upsert()
函数,您可以通过一点抽象来实现这一点,这样它就可以被重用,而不仅仅是用于这个特定的模式
upsert()
包含一些合理的函数默认值,如果所有对象都是具有基元值的字典,那么这些函数就可以正常工作

函数向上插入(
数组,对象,键fn,
updateFn=(目标,对象)=>object.assign(目标,对象),
insertFn=object=>object
) {
常量键=键FN(对象)
常量索引=array.findIndex(
值=>keyFn(值)==key
)
if(index!=-1)updateFn(数组[index],对象)
else数组.push(insertFn(对象))
}
设arr=[
{taxonomy:'category',id:[10100]},
{分类法:'post_tag',id:[20]}
]
const obj={taxonomy:'category',id:30}
向上插入(
啊,obj,,
o=>o.taxonomy,//用于确定是否应更新现有对象
(t,o)=>t.id.push(o.id),//更新现有对象的操作
({id,…o})=>({…o,id:[id]})//返回要插入的新对象
)

console.log(arr)
if(arr[0].taxonomy)…
由于您的对象只有两个看起来像键和值的属性,您是否考虑过使用对象而不是数组
let obj={category:[10100],post_tag:[20]}
这将简化对匹配分类法的搜索。谢谢,@Nina Scholz非常有用!您还可以告诉我如何在if语句中检查item.id是否已存在于数组中,以便将其从数组中删除吗?在这种情况下,您可以使用相同的回调函数检查值是否不等
-1
,如果只有一个项,则使用此索引拼接数组,或者过滤数组并将过滤后的数组分配给
array
。谢谢,我似乎不知道怎么做。。我似乎不明白out@keviniooooooo,我添加了一个如何删除现有
id
的示例。谢谢@Nina Scholz,我觉得有点困惑,是否应该将示例添加到第一个if语句中?一些上下文:我将所有这些代码放在一个函数中,该函数是在checkbox onChange事件中触发的