通过字段名称从数组中删除元素

时间:2018-09-19 16:38:31

标签: javascript jquery arrays

我有下一个数组:

0: {id: "10", tipo: "work"}
1: {id: "11", tipo: "work"}
2: {id: "24", tipo: "school"}
3: {id: "9", tipo: "work"}
4: {id: "25", tipo: "school"}

我要做的是从两个值匹配的数组中删除一个元素,例如,如果id = 24tipo = school,必须删除位置2的数组,我有此函数通过以下值查找数组键:

function eliminarElementoArray(array,val1,val2){   
     for (var i=0; i<array.length; i++){
       if (array[i].id == val1 && array[i].tipo == val2)                    
          return i;
       else
          return false;
     }
 } 

该函数无法正常工作,在某些情况下它返回false,在其他情况下,它返回错误的值。

最后是删除数组值的地方,但是由于前一个函数没有返回正确的值,所以它不起作用:

selected.splice( eliminarElementoArray(selected, id, tipo), 1);

如果有人可以帮助我,我将不胜感激。

11 个答案:

答案 0 :(得分:4)

问题:

return false;循环内的 for语句: 该函数将始终检查数组的第一个元素,然后检查是否与之匹配将移至else子句并返回false,而不会遍历其余元素。

解决方案:

您应该将return语句移出循环,因此,如果数组中没有元素与传递的参数匹配,则函数将返回false

注意:正如@Taplar的评论所说,最好返回-1之类的Truthy(无falsy)值,例如splice()方法会将false视为零0,并删除第一项。

function eliminarElementoArray(array, val1, val2) {
  for (var i = 0; i < array.length; i++) {
    if (array[i].id == val1 && array[i].tipo == val2)
      return i;
  }

  return -1;
}

var my_array = [{id: "10",tipo: "work"}, {id: "11",tipo: "work"}, {id: "24",tipo: "school"}, {id: "9",tipo: "work"}, {id: "25",tipo: "school"}];

console.log(eliminarElementoArray(my_array, "10", "work"));
console.log(eliminarElementoArray(my_array, "11", "fail test"));
console.log(eliminarElementoArray(my_array, "25", "school"));

答案 1 :(得分:1)

您可以简单地使用Array.filter函数。

您的代码变为:

const array = [{id: 23, tipo: 'foo'}, {id: 25, tipo: 'school'}, {id: 24, tipo: 'school'}]

const filteredArray = array.filter(element => element.id !== 24 || element.tipo !== 'school')

console.log(filteredArray)

答案 2 :(得分:1)

如果在return false中使用else,则该函数将在第一个元素之后立即返回。

function eliminarElementoArray(array,val1,val2){   
     for (i in array){
       if (array[i].id == val1 && array[i].tipo == val2)                    
          return i;
     }
     return false;
 } 

答案 3 :(得分:0)

data = [
 {id: "10", tipo: "work"},
 {id: "11", tipo: "work"},
 {id: "24", tipo: "school"},
 {id: "9", tipo: "work"},
 {id: "25", tipo: "school"}
]

function removeByIdAndTipo(idValue, tipoValue){
  return data.filter(({ id, tipo })=> { 
   return !(id === idValue && tipo === tipoValue)
  })
}

console.log("filteredData", removeByIdAndTipo("24", "school"))

答案 4 :(得分:0)

快捷方式是

var data=[
   {id: "10", tipo: "work"},
   {id: "11", tipo: "work"},
   {id: "24", tipo: "school"},
   {id: "9", tipo: "work"},
   {id: "25", tipo: "school"}
]

var values=$.grep(data,p=>{
    return !(p.id === "24" && p.tipo === "school")
})

console.log(values)

答案 5 :(得分:0)

使用Array.filter来发挥自己的优势。

const deleteElement = (idValue, tipoValue) => {
  return yourArrayName.filter(el => el.id !== idValue && el.tipe !== tipoValue)
}

然后将值传递给deleteElement函数,如下所示:

newArray = deleteElement('24','work')

答案 6 :(得分:0)

正如其他答案已经指出的那样,存在一些逻辑错误(例如该函数将在第一次失配后立即返回)。

但是对于您的用例,您不需要先循环来查找与两个值都匹配的索引,最后使用Array.splice删除它。

一种解决方案是只循环数组,然后将不匹配的元素推入一个新数组,最后返回该新数组。

let test = [{
    id: "10",
    tipo: "work"
  },
  {
    id: "11",
    tipo: "work"
  },
  {
    id: "24",
    tipo: "school"
  },
  {
    id: "9",
    tipo: "work"
  },
  {
    id: "25",
    tipo: "school"
  }
]

function eliminarElementoArray(array, val1, val2) {
  let unmatch = []
  for (var i = 0; i < array.length; i++) {
    if (!(array[i].id == val1 && array[i].tipo == val2))
      unmatch.push(array[i])
  }
  return unmatch
}
console.log(eliminarElementoArray(test, 24, 'school'))

答案 7 :(得分:0)

lodash的方式。

   let arr = [
            { id: "10", tipo: "work" },
            { id: "11", tipo: "work" },
            { id: "24", tipo: "school" },
            { id: "9", tipo: "work" },
            { id: "25", tipo: "school" }
        ];
    function test(array, val1, val2){
            _.remove(array, item =>{
                return item.id == val1 && item.tipo == val2;
            })
        }
    test(arr, '9', 'work');
    console.log(arr);

答案 8 :(得分:0)

var arr = [
    {
        id : "1",
        typo: "aba"
    },
    {
        id : "2",
        typo: "school"
    },
    {
        id : "3",
        typo: "alibaba"
    }
];

function removeItemByTypo(arr,id,typo){
    arr.forEach(function(elem,index) {
      if(elem.id == id && elem.typo == typo){
        arr.splice(index,1);
      }
    });
}

removeItemByTypo(arr,"2","school");
console.log(arr);

您可以在数组中使用forEach使用2个args是elem和index,elem通过id和typo查找对象,并使用index进行拼接。希望我的答案很清楚!

答案 9 :(得分:0)

   var array = [];
   array[1] = {id: "10", tipo: "work"};
   array[2] = {id: "11", tipo: "work"};
   array[3] = {id: "24", tipo: "school"};
   array[4] = {id: "9", tipo: "work"};
   array[5] = {id: "25", tipo: "school"};

   function eliminarElementoArray(array,val1,val2){
       for(var i = 1; i < array.length; i++) {
           if(array[i].id == val1 && array[i].tipo == val2) {
              array.splice(i, 1);
              break;
           }
       }
   }
   array.splice(eliminarElementoArray(array,11,"work"), 1);
   console.log(array);

答案 10 :(得分:0)

  1. 首先,您应该将字符串(tipo)与===而不是==进行比较。

  2. 您必须删除else,因为与else相比,您仅在比较第一个元素。您的功能应如下所示:

    function eliminarElementoArray(array,val1,val2){   
      for (var i=0; i<array.length; i++){
        if (array[i].id == val1 && array[i].tipo === val2)                  
            return i;
      }
    }
    

希望对您有所帮助:)