我有下一个数组:
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 = 24
和tipo = 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);
如果有人可以帮助我,我将不胜感激。
答案 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)
首先,您应该将字符串(tipo)与===
而不是==
进行比较。
您必须删除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;
}
}
希望对您有所帮助:)