如何从 js 中的数组中删除具有通用值的对象



有一个像这样的对象数组

   "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 de Crédito),直到我只保留其中一个。知道如何实现这一目标吗?

我尝试在数组上使用循环,但不知道如何删除特定对象

您可以使用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);

您可以使用

Map通过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);  

您可以使用 .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 );

管理这个恕我直言的最干净方法是通过简单的 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>

你可以使用 _.uniqBy 从 lodash 通过以下方式保持简单和干净

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

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)

最新更新