#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 не использует подчеркивание.