首页 > 解决方案 > 如何从数组中删除对象

问题描述

最初我有这个json,我需要留下“名称”:[]只有那些名称不重复的对象

{
        "type": "city",
        "names": [
            {
                "name": "Citi1",
                "index": 0,
                "names": [
                    0,
                    1,
                    4
                ]
            },
            {
                "name": "Citi1",
                "index": 1,
                "names": [
                    0,
                    1,
                    4
                ]
            },
            {
                "name": "Citi2",
                "index": 2,
                "names": [
                    2,
                    3
                ]
            },
            {
                "name": "Citi1",
                "index": 4,
                "names": [
                    0,
                    1,
                    4
                ]
            }
        ]

如何从具有重复“名称”的 ["names"] 数组中删除对象?

例如,我需要删除 citi1 重复的对象,只留下其中 1 个预期对象

{
        "type": "city",
        "names": [
            {
                "name": "Citi1",
                "index": 0,
                "names": [
                    0,
                    1,
                    4
                ]
            },
            {
                "name": "Citi2",
                "index": 2,
                "names": [
                    2,
                    3
                ]
            },
           
        ]


我试过的代码

 for(let i = 0; i < queueTypes.length; i++){
queueTypes[i]["names"].forEach(  function (item, index) {
                   
                    let tmpIndex = index;

                    for(let j = 0; j < queueTypes[i]["names"].length; j++){
                         if(queueTypes[i]["names"][j].name == item.name){
                             if( tmpIndex != j ){
                     
                                delete queueTypes[i]["names"][j]

                             }
                        }
                    }
                });
}

试图遍历这个数组并检查名称是否相同,但索引与我正在检查的元素不匹配

标签: javascriptjsonfor-loopobject

解决方案


name要根据数组中的键过滤重复对象names,您可以存储唯一名称的映射并过滤掉映射中已有的任何名称。

const myData = {
  "type": "city",
  "names": [
      {
          "name": "Citi1",
          "index": 0,
          "names": [
              0,
              1,
              4
          ]
      },
      {
          "name": "Citi1",
          "index": 1,
          "names": [
              0,
              1,
              4
          ]
      },
      {
          "name": "Citi2",
          "index": 2,
          "names": [
              2,
              3
          ]
      },
      {
          "name": "Citi1",
          "index": 4,
          "names": [
              0,
              1,
              4
          ]
      }
  ]
};

const transform = data => {
  const unique = {};

  return {
    ...data,
    names: data.names.filter(({ name }) => {
      if (unique[name]) {
         return false;
       } else {
         unique[name] = true;
         return true;
       }
     })
  };
};

console.log(transform(myData));


推荐阅读