【问题标题】:Remove specific array element from JSON object in javascript从 javascript 中的 JSON 对象中删除特定的数组元素
【发布时间】:2021-04-24 11:42:35
【问题描述】:

我有以下对象数组-

var myarray = [ { "id": "", "AlphaNumber": "ADF12345", "terms": "1" }, { "id": "ABC12345", "AlphaNumber": "LL8888", "terms": "1" }, { "id": "", "AlphaNumber": "KK6666", "terms": "2" }, { "id": "", "AlphaNumber": "QQ1111", "terms": "3" }, { "id": "ABC12346", "AlphaNumber": "RR4444", "terms": "3" }, { "id": "", "AlphaNumber": "SS1111", "terms": "5" }, { "id": "ABC12347", "AlphaNumber": "ASQE223", "terms": "5" } ]

我想检查数组中是否存在相同术语的多个条目并删除具有 id="" 的节点,这意味着我的输出将具有术语且 id 不等于 ''(空字符串)的条目重复的术语条目。

myarray 逻辑后的最终值如下:

[{"id":"ABC12345","AlphaNumber":"LL8888","terms":"1"},{"id":"","AlphaNumber":"KK6666","terms":"2"},{"id":"ABC12346","AlphaNumber":"RR4444","terms":"3"},{"id":"ABC12347","AlphaNumber":"ASQE223","terms":"5"}]

【问题讨论】:

    标签: javascript arrays json object


    【解决方案1】:

    terms 作为键创建一个map 对象。如果当前termsmap中不存在或者已经存在的对象没有id,则使用当前对象

    const myarray = [ { "id": "", "AlphaNumber": "ADF12345", "terms": "1" }, { "id": "ABC12345", "AlphaNumber": "LL8888", "terms": "1" }, { "id": "", "AlphaNumber": "KK6666", "terms": "2" }, { "id": "", "AlphaNumber": "QQ1111", "terms": "3" }, { "id": "ABC12346", "AlphaNumber": "RR4444", "terms": "3" }, { "id": "", "AlphaNumber": "SS1111", "terms": "5" }, { "id": "ABC12347", "AlphaNumber": "ASQE223", "terms": "5" } ]
    
    const map = {};
    
    for (const o of myarray) {
      if (!map[o.terms]?.id)
        map[o.terms] = o
    }
    
    console.log( Object.values(map) )

    【讨论】:

      【解决方案2】:

      使用Array#reduceMap

      1. 将您的数据按terms 分组到Map
      2. 查找id 不是empty 字符串的项目,如果这样的项目不存在,则选择第一个项目。

      const 
        myarray = [ { "id": "", "AlphaNumber": "ADF12345", "terms": "1" }, { "id": "ABC12345", "AlphaNumber": "LL8888", "terms": "1" }, { "id": "", "AlphaNumber": "KK6666", "terms": "2" }, { "id": "", "AlphaNumber": "QQ1111", "terms": "3" }, { "id": "ABC12346", "AlphaNumber": "RR4444", "terms": "3" }, { "id": "", "AlphaNumber": "SS1111", "terms": "5" }, { "id": "ABC12347", "AlphaNumber": "ASQE223", "terms": "5" } ],
        
        res = Array.from(myarray.reduce(
          (m, o) => (m.has(o.terms) ? m.get(o.terms).push(o) : m.set(o.terms, [o]), m),
          new Map()
        ).values(), (v) => v.find(o => o.id !== "") || v[0]);
      
      console.log(JSON.stringify(res));

      【讨论】:

        【解决方案3】:

        您可以执行 2 个步骤:

        1. terms分组数据
        2. 当组中的数据大于 1 项时过滤数据。否则,将数据保留在只有一项的组中。
        if(values.length > 1) values = values.filter(r => r.id !== "");
        

        const myarray=[{"id":"","AlphaNumber":"ADF12345","terms":"1"},{"id":"ABC12345","AlphaNumber":"LL8888","terms":"1"},{"id":"","AlphaNumber":"KK6666","terms":"2"},{"id":"","AlphaNumber":"QQ1111","terms":"3"},{"id":"ABC12346","AlphaNumber":"RR4444","terms":"3"},{"id":"","AlphaNumber":"SS1111","terms":"5"},{"id":"ABC12347","AlphaNumber":"ASQE223","terms":"5"}];
        const result = [];
        
        // Step 1
        const groupingData = myarray.reduce((acc, curr) => {
          acc[curr.terms] ??= [];
          acc[curr.terms].push(curr);
          return acc;
        }, {});
        
        // Step 2
        for(let [key, values] of Object.entries(groupingData)){
          if(values.length > 1) values = values.filter(r => r.id !== "");
          result.push(values);
        }
        console.log(result.flat());

        【讨论】:

        • 您当前解决方案的两个问题:1) 如果有两个项目term 相同但id 两者都为空,那么结果将没有任何对象与此term
        • 2) 如果有 2 个项目的 term 相同且 id 两者都不为空,那么结果将有两个对象都带有这个 term
        • 我不这么认为。您可以再次阅读 OP 的要求并检查我的输出答案
        • 对于 OP 的当前输入,它可以工作,但对于其他输入,它可能会失败。考虑这个输入[{ id: "", AlphaNumber: "ADF12345", terms: "1" }, { id: "", AlphaNumber: "LL8888", terms: "1" }]
        【解决方案4】:

        我的建议:

        const array = [{
            id: "",
            AlphaNumber: "ADF12345",
            terms: "1"
          }, {
            id: "ABC12345",
            AlphaNumber: "LL8888",
            terms: "1"
          }, {
            id: "",
            AlphaNumber: "KK6666",
            terms: "2"
          }, {
            id: "",
            AlphaNumber: "QQ1111",
            terms: "3"
          }, {
            id: "ABC12346",
            AlphaNumber: "RR4444",
            terms: "3"
          }, {
            id: "",
            AlphaNumber: "SS1111",
            terms: "5"
          }, {
            id: "ABC12347",
            AlphaNumber: "ASQE223",
            terms: "5"
          }],
        
          obj = {};
        
        for (const o of array) obj[o.terms]?.id || (obj[o.terms] = o);

        更多关于Optional chaining (?.)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-21
          • 2021-11-01
          • 2011-11-09
          • 2016-05-12
          • 2018-08-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多