如何从JS数组中删除具有公共值的对象?

时间:2018-12-27 13:07:27

标签: javascript arrays object

具有这样的对象数组

   "medios":[  
      {  
         "Key":"1",
         "Text":"Cheque"
      },
      {  
         "Key":"2",
         "Text":"Tarjeta de Crédito"
      },
      {  
         "Key":"3",
         "Text":"Tarjeta de Crédito"
      },
      {  
         "Key":"4",
         "Text":"Tarjeta de Crédito"
      },
      {  
         "Key":"5",
         "Text":"Transferencia Bancaria"
      }
   ]

我需要能够删除具有相同“文本”值的对象(例如,Tarjeta deCrédito),直到我只保留其中之一。关于如何实现这一目标的任何想法?

我通过对数组使用循环来尝试,但是不知道如何删除特定对象

6 个答案:

答案 0 :(得分:2)

您可以使用Text通过const obj = {"medios":[{ "Key":"1","Text":"Cheque"},{ "Key":"2","Text":"Tarjeta de Crédito"},{ "Key":"3","Text":"Tarjeta de Crédito"},{ "Key":"4","Text":"Tarjeta de Crédito"},{ "Key":"5","Text":"Transferencia Bancaria"}]}; obj.medios = Array.from(new Map(obj.medios.map(m => [m.Text, m])).values()); console.log(obj.medios); 来键入数据,这样您将仅获得唯一的条目。然后从该映射中获取值以再次重建数组:

{{1}}

答案 1 :(得分:2)

您可以使用reduce并在添加元素时不添加元素。

var medios = [{"Key": "1","Text": "Cheque"},{"Key": "2","Text": "Tarjeta de Crédito"},{"Key": "3","Text": "Tarjeta de Crédito"},{"Key": "4","Text": "Tarjeta de Crédito"},{"Key": "5","Text": "Transferencia Bancaria"}];

medios = medios.reduce((c, n) =>
  c.find(el => el.Text == n.Text) ? c : [...c, n], []);
console.log(medios);

答案 2 :(得分:1)

您可以将.filter()数组方法与单独的数组结合使用,以跟踪哪些文本我们已经创建了仅包含所需元素的新数组。第一个条目将保留,因此我们希望在新数组中保留键2,并删除键3和键4。

const data = {
  "medios":[  
    {  
     "Key":"1",
     "Text":"Cheque"
    },
    {  
     "Key":"2",
     "Text":"Tarjeta de Crédito"
    },
    {  
     "Key":"3",
     "Text":"Tarjeta de Crédito"
    },
    {  
     "Key":"4",
     "Text":"Tarjeta de Crédito"
    },
    {  
     "Key":"5",
     "Text":"Transferencia Bancaria"
    }
   ]
};

const seen = [];

const result = {
  "medios": data.medios.filter( entry => {
    const already_seen = seen.includes( entry.Text );
    if ( already_seen ) return false;
    else {
      seen.push( entry.Text );
      return true;
    }
  })
};

console.log( result );

答案 3 :(得分:1)

管理此IMHO的最干净方法是通过简单的lodash _.uniqBy()方法:

const medios = [  
      {  
         "Key":"1",
         "Text":"Cheque"
      },
      {  
         "Key":"2",
         "Text":"Tarjeta de Crédito"
      },
      {  
         "Key":"3",
         "Text":"Tarjeta de Crédito"
      },
      {  
         "Key":"4",
         "Text":"Tarjeta de Crédito"
      },
      {  
         "Key":"5",
         "Text":"Transferencia Bancaria"
      }
   ]


console.log(_.uniqBy(medios, 'Text'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

答案 4 :(得分:1)

您可以使用lodash中的_.uniqBy通过以下方式使其简洁明了

// medios = [{Key: 1, Text: '' }, {Key: 2, Text: '' } ]
medios = _.uniqBy(medios, 'Text');

答案 5 :(得分:0)

您可以使用reduce。在reduce回调内部,使用find检查累加器数组是否包含带有此文本的对象。 find返回一个布尔值。如果为false,则将当前对象推入累加器

let medios = [{
    "Key": "1",
    "Text": "Cheque"
  },
  {
    "Key": "2",
    "Text": "Tarjeta de Crédito"
  },
  {
    "Key": "3",
    "Text": "Tarjeta de Crédito"
  },
  {
    "Key": "4",
    "Text": "Tarjeta de Crédito"
  },
  {
    "Key": "5",
    "Text": "Transferencia Bancaria"
  }
]
let k = medios.reduce((acc, curr) => {
  let findText = acc.find((item) => {
    return item.Text.toLowerCase() === curr.Text.toLowerCase();
  });
  if (!findText) {
    acc.push(curr)
  }
  return acc;
}, []);

console.log(k)