Я пытаюсь удалить строку из объекта, если эта строка имеет те же значения, что и свойство, которое я хочу удалить.

Это моя попытка, и она работает, просто интересно, есть ли более эффективный способ

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"}];
1
bombombs 21 Янв 2022 в 17:46
Этот код работает так, как ожидалось? С какой проблемой вы столкнулись? вы получаете какие-либо ошибки? --- Редактировать: О, извините, вы просите улучшения.
 – 
evolutionxbox
21 Янв 2022 в 17:50

3 ответа

Даже не указывайте свойства в качестве аргументов. Вы можете определить их как 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 если вы с ними не знакомы.

2
Amila Senadheera 21 Янв 2022 в 18:03
@bombombs, посмотри !!
 – 
Amila Senadheera
21 Янв 2022 в 18:05

Вы можете .filter() для удаления всех элементов, где все три реквизита равны:

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"));
0
Xeelley 21 Янв 2022 в 17:54

Вы можете использовать методы 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);
0
Raffaele 21 Янв 2022 в 17:57
Просто имейте в виду, что это не изменяет исходный массив.
 – 
evolutionxbox
21 Янв 2022 в 17:54