【问题标题】:How to update the duplicate object in json array with a boolean如何使用布尔值更新 json 数组中的重复对象
【发布时间】:2019-11-20 11:48:30
【问题描述】:

我遇到了一个数组的小问题。我想通过用布尔值更新对象属性来识别数组中的重复对象。请看下面的数组。

var jsonArray = [{
  SKILL: "Java",
  name: "ravi",
  checkDuplicate: ""
}, {
  SKILL: "SAP",
  name: "robert",
  checkDuplicate: ""
}, {
  SKILL: "Java",
  name: "rahim",
  checkDuplicate: ""
}, {
  SKILL: "Oracle",
  name: "singh",
  checkDuplicate: ""
}]

如果你看到上面的数组,SKILL: Java 被复制了。我想将数组更新为以下格式。

var jsonArray = [{
  SKILL: "Java",
  name: "ravi",
  checkDuplicate: true
}, {
  SKILL: "SAP",
  name: "robert",
  checkDuplicate: false
}, {
  SKILL: "Java",
  name: "rahim",
  checkDuplicate: false
}, {
  SKILL: "Oracle",
  name: "singh",
  checkDuplicate: false
}]

有人可以帮我解决这个要求吗?

【问题讨论】:

  • jsfiddle.net/5TRqF/1 你得修改这个
  • 不应该是标记为“重复”的第三个元素......?
  • @ZER0,是的。即使三个技能是重复的,只有一个技能我们需要是真的,其他两个技能必须是假的。

标签: javascript jquery arrays json


【解决方案1】:
jsonArray.map((item, i) => ({
    ...item,
    checkDuplicate: jsonArray.filter((o, j) => j>i).filter(o => o.SKILL == item.SKILL).length>0
}))

输出:

[
   {"SKILL":"Java","name":"ravi","checkDuplicate":true},
   {"SKILL":"SAP","name":"robert","checkDuplicate":false},
   {"SKILL":"Java","name":"rahim","checkDuplicate":false},
   {"SKILL":"Oracle","name":"singh","checkDuplicate":false}
]

【讨论】:

    【解决方案2】:
    jsonArray.map(item => ({
        ...item,
        checkDuplicate: jsonArray.filter(jsonArrayItem => jsonArrayItem.SKILL == item.SKILL).length>1
    }))
    

    输出:

    [
      {
        "SKILL": "Java",
        "name": "ravi",
        "checkDuplicate": true
      },
      {
        "SKILL": "SAP",
        "name": "robert",
        "checkDuplicate": false
      },
      {
        "SKILL": "Java",
        "name": "rahim",
        "checkDuplicate": true
      },
      {
        "SKILL": "Oracle",
        "name": "singh",
        "checkDuplicate": false
      }
    ]
    

    【讨论】:

    • 感谢您的帮助。这里两个 Java 对象都更新为 true,我不希望这样.. 只有一个对象必须更新为 true,而另一个对象应该为 false。
    • 好的,但是如果三个技能的值相同呢?仍然只有第一个遇到的应该设置为true,其他两个设置为false
    • 请检查我的其他答案,现在可以了,我只是添加了一个 filter() 来检查当前元素是否存在于下一个元素中
    • @ZER0,是的。即使三个技能是重复的,只有一个技能我们需要有真,另外两个技能必须是假的。
    • 好的,那么您可以使用我的其他答案并将“length>0”替换为“length==1”,只有一个为真(最后一个之前的那个)
    【解决方案3】:

    所以根据 cmets,类似的东西应该可以工作:

    var jsonArray = [{
      SKILL: "Java",
      name: "ravi",
      checkDuplicate: ""
    }, {
      SKILL: "SAP",
      name: "robert",
      checkDuplicate: ""
    }, {
      SKILL: "Java",
      name: "rahim",
      checkDuplicate: ""
    }, {
      SKILL: "Oracle",
      name: "singh",
      checkDuplicate: ""
    }]
    
    // We need an helper function that works similar to both 
    // array's `find`:
    // <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find>
    //
    // and `indexOf`:
    // <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf>
    //
    const find = (array, predicate, fromIndex) => {
        for (let i = fromIndex; i < array.length; i++) {
        if (predicate(array[i], i)) {
          return true;
        }
      }
      return false;
    }
    
    // Here the main loop, we also declare a `dupes` object to keep
    // track of the duplicated `SKILL`
    for (let dupes = {}, i = 0; i < jsonArray.length; i++) {
      let {SKILL} = jsonArray[i];
    
      // increment using negate + NOT
      dupes[SKILL] = -~dupes[SKILL]; 
    
      // Here we mutate the array, and we set `true`
      // only if it's the first time we encounter this `SKILL`
      // and if there are items with the same `SKILL` after
      // the current item
      jsonArray[i].checkDuplicate = dupes[SKILL] === 1 && find(jsonArray, item => item.SKILL === SKILL, i + 1);
    }
    
    jsonArray
    

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 2022-11-24
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多