按字段名从数组中删除一个元素

7

我有一个数组:

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);

如果有人能够帮助我,我将不胜感激。

请将您的对象数组以“文本”而不是“图像”的形式发布。 - A l w a y s S u n n y
1
仅从您的方法中观察,有时会返回false。而您正在将该响应提供给splice方法。这是无效的。您需要获取响应,检查它是否不是false,然后再将该响应提供给splice。 - Taplar
1
另外,根据您当前的逻辑编写方式,如果第一个元素不匹配,则会返回false,而不考虑数组中的任何其他元素。 - Taplar
是的,这就是问题所在,有时候它会返回false,但我不知道为什么,如果所有字段都匹配。 - U.C
就像我说的那样,如果它不匹配数组中的第一个元素,在第一次迭代中它会返回false。它没有机会进行更多的迭代。它正在从函数中返回并结束循环。 - Taplar
你想要什么输出 @U.C - chintuyadavsara
11个回答

4

问题 :

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

解决方案 :

您应该将返回语句移出循环,这样,如果数组的任何元素都不匹配传递的参数,则函数将返回false

注意:正如@Taplar的评论所说,最好返回一个真值(没有falsy),例如-1,因为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
请注意,如果您的条件语句可以匹配第一个元素,则0为假值。因此,您的条件语句需要明确检查返回的值是否为“!==”false。 - Taplar
感谢您的介入@Taplar,您是正确的,splice()方法将把false视为零并删除第一个元素。 - Zakaria Acharki

1
如果你在else语句中使用return false,函数将会在第一个元素后立即返回。
function eliminarElementoArray(array,val1,val2){   
     for (i in array){
       if (array[i].id == val1 && array[i].tipo == val2)                    
          return i;
     }
     return false;
 } 

1
使用Array.filter可以让你受益。
const deleteElement = (idValue, tipoValue) => {
  return yourArrayName.filter(el => el.id !== idValue && el.tipe !== tipoValue)
}

然后将这些值传递给deleteElement函数,如下所示:
newArray = deleteElement('24','work')

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)


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)

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);

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个参数elem和index,其中elem用于通过id和typo查找对象,index用于splice操作。希望我的回答清晰明了!


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);

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"))


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'))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接