Удалить объект, возвращаемый функцией - PullRequest
0 голосов
/ 12 декабря 2018

Предположим, у меня есть такой объект

var $obj = {
    0 : {
        'id' : 3,
        'label' : 'Item One'
    },
    1 : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

И такая функция:

function findById(obj, id){
    var result = false;
    $.each(obj, function(index, element){
        if(element.id === id)
        {
            result = element;
            return false;//stops $.each iteration
        }
    })
    return result;
}

Теперь давайте предположим, что я хочу удалить элемент с идентификатором "7"программно, как при нажатии на кнопку, в любом случае я запускаю свою функцию следующим образом:

delete findById($obj, 7);

После этого «удалить» свойство с ключом 1 и id = 7 все еще там.Я знаю, что что-то упустил, но я не могу выбраться из этого xD.Как мне удалить свойство из исходного объекта?Я уверен, что в javascript есть что-то общее с областью видимости или в любом случае, что я до сих пор не могу понять.Но я продолжаю сталкиваться с такими проблемами и не могу найти полный ответ на этот вопрос.

Заранее благодарю всех, кто может мне помочь с этим;)

Ответы [ 4 ]

0 голосов
/ 12 декабря 2018

если у вас есть массив объектов вместо коллекции, вы можете использовать функцию filter

var $obj = [
   {
      'id' : 3,
      'label' : 'Item One'
   },
   {
      'id' : 7,
      'label' : 'Item Two'
    }
];

function deleteElementByID($obj, id){
  return $obj.filter(function(item){
    return item.id != id;
  });
}

, если вы не можете или не хотите преобразовывать ее в массив, тогда вы можетеиспользуйте функцию карты jQuery:

function deleteElementByID(id){
  $obj = $.map($obj,function(item,index){
    if(item.id != id) return item;
  });
}
0 голосов
/ 12 декабря 2018

Если я правильно понял, вы хотите удалить свойство, соответствующее выбранному элементу, из исходного объекта, верно?

function findById(obj, id){
    var result = false;
    $.each(obj, function(index, element){
    
        // here the index is the name of the property on the original item. So "A", "B" etc.
        console.dir(index);
        if(element.id === id)
        {
            // you will need to know the name of the property you want to delete, not its value.
            result = index;
            return false;//stops $.each iteration
        }
    })
    return result;
}

var $obj = {
    "A" : {
        'id' : 3,
        'label' : 'Item One'
    },
    "B" : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

// first you get the property name.
var propertyName = findById($obj, 7);
console.dir("Property to delete is: "+ propertyName);

console.dir("Original object before property deletion:");
console.dir($obj);
delete $obj[propertyName];
console.dir("Original object after property deletion:");
console.dir($obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Некоторые пояснения:
delete выполняет удаление свойства из объекта JavaScript ( ссылка ).
Ваш оригинальный объект имеет два свойства, «A» и «B».Вы хотите удалить элемент «B» из объекта - в JavaScript это означает удаление свойства из объекта.
Поэтому вам нужно передать методу удаления ссылку на свойство для удаления: вот почему яизменили функцию findById, чтобы она возвращала «индекс» (он же имя) элемента вместо его фактического значения.
В последней инструкции delete $obj[propertyName]; используется тот факт, что имена свойств в JavaScript также могут бытьиспользуется в качестве индексатора объекта.Следовательно, в данном конкретном случае линия может рассматриваться как эквивалентная delete $obj.B.

0 голосов
/ 12 декабря 2018

На мой взгляд, самое простое решение "one liner" - вернуть индекс.это даст вам некоторые преимущества

  1. вам не нужно создавать новую функцию
  2. ваша старая функция не потеряет свою функциональность

тогда вы можете удалитьобъект по возвращенному индексу.

пожалуйста, закажите мой snippet и, пожалуйста, прокомментируйте, если есть что-то, что я могу помочь улучшить мой ответ.

хорошего дня ..

var $obj = {
    0 : {
        'id' : 3,
        'label' : 'Item One'
    },
    1 : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

function findById(obj, id){
    var result = false;
    $.each(obj, function(index, element){
        if(element.id === id)
        {
            result = element;
            
            //return the index
            result.index = index;
            
            return false;//stops $.each iteration
        }
    })
    return result;
}

//delete object by index
delete $obj[findById($obj, 7).index]


console.log($obj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
0 голосов
/ 12 декабря 2018

Когда вы повторяете объект с $.each, то, что вы называете index, фактически является ключом объекта.

Поскольку ваш findById() не возвращает этот ключ, вы можете захотеть отдельный методдля удаления

var $obj = {
    0 : {
        'id' : 3,
        'label' : 'Item One'
    },
    1 : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

function deleteById(obj, id){    
    $.each(obj, function(key, element){
        if(element.id === id) {
           delete obj[key]
           return false;//stops $.each iteration
        }
    });   
}

deleteById($obj, 7)

console.log($obj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...