【问题标题】:Javascript update a array data depending on keyJavascript根据键更新数组数据
【发布时间】: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]
});

【问题讨论】:

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

标签: javascript arrays json


【解决方案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-wrapper{min-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);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        • 2021-11-29
        • 2020-04-06
        • 2017-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多