удалить элемент массива с помощью javascript

#javascript #jquery #arrays

#javascript #jquery #массивы

Вопрос:

Я новичок в javascript и jquery, мне нужно удалить элемент из приведенной ниже структуры массива

 [{
    "tag": "tag1",
    "description": "description1"
}, {
    "tag": "tag2",
    "description": "description2"
}, {
    "tag": "tag3",
    "description": "description3"
}]
  

Элемент, который нужно удалить, известен {"tag":"tag2", "description":"description2"} .

Как я могу найти этот элемент и удалить из массива.

Пожалуйста, найдите код, который я использую для удаления элемента

 var actionDic = [];

actionDic.push({
    description: desc,
    tag: tag
});
  

Массив actionDic заполняется, когда пользователь вводит текст в textinput и выбирает опцию «добавить».

 var deleterow = {
    tag: "tag2",
    description: "description2"
};
var index = $.inArray(deleterow, actionDic);
if (index != -1) {
    actionDic.splice(index, 1);
}
  

Правильный индекс не получен. Пожалуйста, дайте мне знать, что не так в коде.

Спасибо.

Комментарии:

1. Когда вы говорите, что правильный индекс не получен , тогда где код $.actionDic() ?

2. Я все еще не вижу кода для функции $.actionDic() .

3. Где находится код функции $.actionDic()? который вы используете для поиска индекса. Проблема в этой функции

4. извините, вместо inArray я использовал actionDic, пожалуйста, найдите обновленный вопрос.

Ответ №1:

Поскольку сравнение между удаляемым элементом и каждым элементом в actionDic не является тривиальным, вы могли бы использовать jQuery.grep() :

 actionDic = jQuery.grep(actionDic, function(elem) {
    return elem.tag == deleterow.tag amp;amp; elem.description == deleterow.description;
}, true);
  

ДЕМОНСТРАЦИЯ

Он выполняет поиск с использованием пользовательской функции поиска и возвращает элементы массива, которые не совпадают. Результат заменяет предыдущее значение actionDic и эффективно удаляет этот один элемент.

Обновить

К сожалению, этот метод может считаться сложным, поскольку при каждом вызове создается новый массив; как с точки зрения возможностей jQuery, так и со стандартной функциональностью JavaScript, эта конкретная функция отсутствует. В ECMAScript 6 будет Array.prototype.find() метод, который будет выполнять поиск индекса в массиве (с помощью которого вы можете выполнить сращивание).

Вы, конечно, можете написать его и сами:

 (function($) {
  $.find = function(arr, fn) {
    for (var i = 0, len = arr.length; i < len;   i) {
      if (fn(arr[i], i, arr)) {
        return i;
      }
    }
    return -1;
  };
}(jQuery));

var index = $.find(actionDic, function(elem) {
  return elem.tag == deleterow.tag amp;amp; elem.description == deleterow.description;
});

if (index != -1) {
  actionDic.splice(index, 1);
}
  

ДЕМОНСТРАЦИЯ

Комментарии:

1. Я думаю, что это должно быть != вместо = в строке elem.tag = deleterow.tag

2. @Satpal Тьфу, ошибка новичка! На самом деле это должно быть == из-за флага инвертирования, который я передаю в качестве последнего аргумента.

3. Да, верно, jsfiddle.net/su3Gx Я иногда путаюсь между filter и grep

4. Спасибо @Jack amp; Satpal

5. @user2071152, вот пример фильтра jsfiddle.net/NgaYM и комментарии downvoters, ребята

Ответ №2:

Я реализовал indexOfObject метод Array prototype в одном из своих проектов. Он ищет индекс object по заданному property имени и значению. Вот оно:

 Array.prototype.indexOfObject = function(searchTerm, property) {
    for (var i = 0, l = this.length; i < l; i  ) {
        if (this[i][property] === searchTerm) {
            return i;
        }
    }

    return -1;
};
  

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

 var arr = [{
    "tag": "tag1",
    "description": "description1"
}, {
    "tag": "tag2",
    "description": "description2"
}, {
    "tag": "tag3",
    "description": "description3"
}], deleteObject = {
    tag: "tag2",
    description: "description2"
};

var index = arr.indexOfObject(deleteObject.tag, 'tag');
  

Затем вы можете использовать этот индекс для удаления объекта из массива:

 if (index > -1) {
   arr.splice(index, 1);
}
  

Вот рабочий пример в JSFiddle.

Ответ №3:

 var actionDic = [{
    "tag": "tag1",
    "description": "description1"
}, {
    "tag": "tag2",
    "description": "description2"
}, {
    "tag": "tag3",
    "description": "description3"
}]

var element = {"tag":"tag2", "description":"description2"}

for(var i=0;i<actionDic.length;i  ) {
    var found = false;
    for(each in actionDic[i]) {
        if(actionDic[i][each] == element[each]) {
            found = true
        } else {
            found = false;
            break;
        }
    }
    if(found) {
        actionDic.splice(i,1);
        found=false;
    }
}
  

Ответ №4:

Это возвращает ваши внутренние объекты массива:

 for (var x = 0; x < actionDic.length; x  ){
    var arrayItem = actionDic[x];
    if (arrayItem["tag"] == "tag2"){
        alert(arrayItem["description"]);
    }
}
  

Рабочая скрипка: http://jsfiddle.net/4khjp /

Ответ №5:

Вы можете использовать underscore.js который содержит множество полезных помощников для объектов, массивов и т.д.

Удаление элемента массива:

 array = _.reject(array, function(item) {
 return item.tag == 'tag2'; // <- if tag is unique to whole array
});
  

Комментарии:

1. К сожалению, OP не использует подчеркивание.