Javascript根据键更新数组数据

Posted

技术标签:

【中文标题】Javascript根据键更新数组数据【英文标题】:Javascript update a array data depending on key 【发布时间】:2022-01-22 20:24:36 【问题描述】:

我有一个简单的数组,我想用值 order:"asc" 更新这个数组,并且仅当 type == "user"key == "country" 时才想删除所有其他 order

const items = [
    
        type: "user",
        values: [
            order:"asc", key:"first_name",
            key:"last_name",
            key:"address",
            key:"country",
        ]
    ,
]

我的预期结果是

const items = [
    
        type: "user",
        values: [
            key:"first_name",
            key:"last_name",
            key:"address",
            order:"asc", key:"country",
        ]
    ,
]

我可以在map 中使用map 来做到这一点。是否可以不循环两次?

items.map(
    x =>  if (x.type == "user") 
        x.values = x.values.map(y => 
            if (y.key.includes("country")) 
                y.order = "asc"
             else if (JSON.stringify(x.values).includes("country")) 
                delete y.order
            
            return y
        )
    
    return [x]
);

【问题讨论】:

您的问题中唯一实际的JSON 是JSON.stringify(x.values) 的结果-并且该调用不是必需的,只是增加了不良行为的潜在来源。 我认为没有双循环是不可能做到这一点的。因为你有两个独立的数组。每个数组都必须有一个循环。 Map、filter、foreEach 都有一个循环。 【参考方案1】:

如果您不想删除order:"asc",如果values 数组中没有country,那么在values 中的每个对象上而不是JSON.stringify(x.values).includes("country"),您可以使用.find(),然后只循环如果有key:"country"的对象,则删除:

const items = [  type: "user", values: [ order:"asc", key:"first_name", key:"last_name", key:"address", key:"country", ] , ]

const result = items.map(obj => 
  if (obj.type === 'user') 
    const country = obj.values.find(o => o.key === 'country')

    if (country) 
      obj.values.forEach(value => delete value.order)
      country.order = 'asc'
    
    
  
  return obj
)

console.log(result)
.as-console-wrappermin-height:100%

【讨论】:

【参考方案2】:
items.filter(itm => itm.type == "user")
  .map(u => u.values.map(v => 
      delete v.order
      if (u.values.key == "country")
        u.values.order = "asc"    
    )
  
); 

【讨论】:

【参考方案3】:

我认为只有双循环才能做到这一点。我写了这个脚本,但它和你的相似。

var newItems = items.map(el => 
  if(el.type === "user")
    el.values = el.values.map(value => 
      if(value.key === "country")
        value["order"] = "asc"
      else if(value["order"] != undefined)
        delete value["order"]
      
      return value
    )
    return el
  
)

【讨论】:

如果我有key:"country",,它就可以工作。如果我没有这个country 键,那么它会从项目order:"asc", key:"first_name", 中删除order:asc。如果值不包含country,我不想删除order:"asc"【参考方案4】:

逻辑

循环遍历items 数组。 使用type 查找节点"type" 从该节点循环遍历values 数组。 清除 "order" 的 key 不是 "country" 的节点 将"order" 添加为"asc",其中键为"country"

工作小提琴

const items = [
  
    type: "user",
    values: [
       order: "asc", key: "first_name" ,
       key: "last_name" ,
       key: "address" ,
       key: "country" ,
    ]
  ,
];

items.filter(item => item.type === "user").forEach(item => 
  item.values.filter(value => value.order === "asc").forEach(value => value.order && value.key !== "country" ? delete value.order : );
  item.values.filter(value => value.key === "country").forEach(value => value.order = "asc");
);

console.log(items);

【讨论】:

以上是关于Javascript根据键更新数组数据的主要内容,如果未能解决你的问题,请参考以下文章

document和javaScript内置对象

使用javascript循环读取JSON数字数组[重复]

如何根据javascript中的键合并和替换两个数组中的对象?

如何循环遍历对象数组并根据 JavaScript 中的条件添加新的对象键?

无法使用Javascript根据键名合并两个不同的数组

如何根据动态键制作Javascript过滤器值