如果匹配所有属性,则从 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)