如果匹配所有属性,则从 JavaScript 对象中删除一行
Deleting a row from a JavaScript object if it matches with all properties
我正在尝试从对象中删除一行,如果该行与我要删除的 属性 具有相同的值。
这是我的尝试,很有效,只是想知道是否有更有效的方法
airport_data_1 = [{"departure_time":"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}];
function remove_airport_row(obj, prop1, prop2, prop3) {
var i = obj.length;
if (i) { // (not 0)
while (--i) {
var current = obj[i];
if (current.departure_time == prop1 && current.arrival_time == prop2 && current.city_id == prop3) {
obj.splice(i, 1);
}
}
}
}
remove_airport_row(airport_data_1, "06:00","09:00","SJC");
console.log(JSON.stringify(airport_data_1));
想要的结果
airport_data_1 = [{"departure_time":"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"}];
可以使用数组的filter
方法:
const filteredArray = airport_data_1.filter(airport => {
return !(
airport.departure_time === "06:00" &&
airport. arrival_time "09:00" &&
airport.city_id === "SJC"
);
});
通过这种方式,您将拥有新数组 (filteredArray
),其中包含 airport_data_1
的所有元素,排除了包含您选择的数据的元素。如果你更喜欢直接从原始数组中删除它而不是创建一个清除的副本,你可以使用 findIndex
方法:
const removeId = airport_data_1.findIndex(airport => {
return (
airport.departure_time === "06:00" &&
airport. arrival_time "09:00" &&
airport.city_id === "SJC"
);
});
airport_data_1.splice(removeId, 1);
您可以 .filter() 删除 all 元素,其中 all 三个属性相等:
const airport_data_1 = [
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}
];
function remove_airport_row(obj, prop1, prop2, prop3) {
return obj.filter(el => el.departure_time !== prop1 || el.arrival_time !== prop2 || el.city_id !== prop3);
}
console.log(remove_airport_row(airport_data_1, "06:00","09:00","SJC"));
甚至不要将属性指定为参数。您可以将它们定义为 object
本身。
这也行
airport_data_1 = [
{ departure_time: "12:00", arrival_time: "03:00", city_id: "BOS" },
{ departure_time: "12:00", arrival_time: "03:00", city_id: "BOS" },
{ departure_time: "01:00", arrival_time: "04:00", city_id: "SFO" },
{ departure_time: "03:00", arrival_time: "05:00", city_id: "BOS" },
{ departure_time: "03:00", arrival_time: "05:00", city_id: "SFO" },
{ departure_time: "04:00", arrival_time: "06:00", city_id: "SJC" },
{ departure_time: "04:00", arrival_time: "06:00", city_id: "JFK" },
{ departure_time: "06:00", arrival_time: "09:00", city_id: "SJC" },
];
function remove_airport_row(arr, obj) {
return arr.filter((row) => {
// ingore the row if all the the properties matches to obj
return !Object.entries(obj).every(([key, value]) => row[key] === value);
})
}
console.log(remove_airport_row(airport_data_1, {
departure_time: "06:00",
arrival_time: "09:00",
city_id: "SJC",
}));
参考文档:Object.entries, Array.prototype.every, Array.prototype.filter 如果您不熟悉它们。
You can put filter in function if you want it as a function()
Filter returns all objects that there props do not match the passed object. You can add props as params or the whole object as i did in my code which i prefer
airport_data_1 = [
{"departure_time":"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}];
const testData = {"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}
console.log("length before filtering data = " ,airport_data_1.length);
let filtered_data = airport_data_1.filter(e => {
// removes all rows that match with testData == the last two objects in airport_data_1
// added one extra obj in index 8 (line 10) to test if the function removes two or more objects with the same value
return !(e.arrival_time === testData.arrival_time && e.departure_time === testData.departure_time && e.city_id === testData.city_id)
})
console.log(filtered_data)
console.log("length after filtering data = " ,filtered_data.length)
我正在尝试从对象中删除一行,如果该行与我要删除的 属性 具有相同的值。
这是我的尝试,很有效,只是想知道是否有更有效的方法
airport_data_1 = [{"departure_time":"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}];
function remove_airport_row(obj, prop1, prop2, prop3) {
var i = obj.length;
if (i) { // (not 0)
while (--i) {
var current = obj[i];
if (current.departure_time == prop1 && current.arrival_time == prop2 && current.city_id == prop3) {
obj.splice(i, 1);
}
}
}
}
remove_airport_row(airport_data_1, "06:00","09:00","SJC");
console.log(JSON.stringify(airport_data_1));
想要的结果
airport_data_1 = [{"departure_time":"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"}];
可以使用数组的filter
方法:
const filteredArray = airport_data_1.filter(airport => {
return !(
airport.departure_time === "06:00" &&
airport. arrival_time "09:00" &&
airport.city_id === "SJC"
);
});
通过这种方式,您将拥有新数组 (filteredArray
),其中包含 airport_data_1
的所有元素,排除了包含您选择的数据的元素。如果你更喜欢直接从原始数组中删除它而不是创建一个清除的副本,你可以使用 findIndex
方法:
const removeId = airport_data_1.findIndex(airport => {
return (
airport.departure_time === "06:00" &&
airport. arrival_time "09:00" &&
airport.city_id === "SJC"
);
});
airport_data_1.splice(removeId, 1);
您可以 .filter() 删除 all 元素,其中 all 三个属性相等:
const airport_data_1 = [
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}
];
function remove_airport_row(obj, prop1, prop2, prop3) {
return obj.filter(el => el.departure_time !== prop1 || el.arrival_time !== prop2 || el.city_id !== prop3);
}
console.log(remove_airport_row(airport_data_1, "06:00","09:00","SJC"));
甚至不要将属性指定为参数。您可以将它们定义为 object
本身。
这也行
airport_data_1 = [
{ departure_time: "12:00", arrival_time: "03:00", city_id: "BOS" },
{ departure_time: "12:00", arrival_time: "03:00", city_id: "BOS" },
{ departure_time: "01:00", arrival_time: "04:00", city_id: "SFO" },
{ departure_time: "03:00", arrival_time: "05:00", city_id: "BOS" },
{ departure_time: "03:00", arrival_time: "05:00", city_id: "SFO" },
{ departure_time: "04:00", arrival_time: "06:00", city_id: "SJC" },
{ departure_time: "04:00", arrival_time: "06:00", city_id: "JFK" },
{ departure_time: "06:00", arrival_time: "09:00", city_id: "SJC" },
];
function remove_airport_row(arr, obj) {
return arr.filter((row) => {
// ingore the row if all the the properties matches to obj
return !Object.entries(obj).every(([key, value]) => row[key] === value);
})
}
console.log(remove_airport_row(airport_data_1, {
departure_time: "06:00",
arrival_time: "09:00",
city_id: "SJC",
}));
参考文档:Object.entries, Array.prototype.every, Array.prototype.filter 如果您不熟悉它们。
You can put filter in function if you want it as a function()
Filter returns all objects that there props do not match the passed object. You can add props as params or the whole object as i did in my code which i prefer
airport_data_1 = [
{"departure_time":"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"12:00","arrival_time":"03:00","city_id":"BOS"},
{"departure_time" :"01:00","arrival_time":"04:00","city_id":"SFO"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"BOS"},
{"departure_time" :"03:00","arrival_time":"05:00","city_id":"SFO"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"SJC"},
{"departure_time" :"04:00","arrival_time":"06:00","city_id":"JFK"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"},
{"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}];
const testData = {"departure_time" :"06:00","arrival_time":"09:00","city_id":"SJC"}
console.log("length before filtering data = " ,airport_data_1.length);
let filtered_data = airport_data_1.filter(e => {
// removes all rows that match with testData == the last two objects in airport_data_1
// added one extra obj in index 8 (line 10) to test if the function removes two or more objects with the same value
return !(e.arrival_time === testData.arrival_time && e.departure_time === testData.departure_time && e.city_id === testData.city_id)
})
console.log(filtered_data)
console.log("length after filtering data = " ,filtered_data.length)