JS найти и удалить объект из массива [duplicate]

JPA 2.0 поддерживает коллекции примитивов через аннотацию @ElementCollection , которую вы можете использовать в сочетании с поддержкой коллекций java.util.Map . Что-то вроде этого должно работать:

  @Entity public class Example {@Id long id;  // .... @ElementCollection @MapKeyColumn (name = "name") @Column (name = "value") @CollectionTable (name = "example_attributes", joinColumns = @ JoinColumn (name = "example_id")) Map & lt; String  , String & gt;  attributes = new HashMap & lt; String, String & gt; ();  // карты из имени атрибута в значение}  

См. также (в спецификации JPA 2.0)

  • 2.6 - Коллекции встраиваемых классов и основных типов
  • 2.7 Карта Коллекции
  • 10.1.11 - ElementCollection Annotation
  • 11.1.29 MapKeyColumn Аннотации
141
задан imperium2335 8 March 2013 в 08:14
поделиться

10 ответов

Одна возможность:

myArray = myArray.filter(function( obj ) {
    return obj.field !== 'money';
});

Обратите внимание, что filter создает новый массив. Любые другие переменные, относящиеся к исходному массиву, не будут получать отфильтрованные данные, хотя вы обновляете исходную переменную myArray с помощью новой ссылки. Используйте с осторожностью.

207
ответ дан Charlie H 15 August 2018 в 18:21
поделиться
  • 1
    Обратите внимание, что filter() доступен только для Internet Explorer 9+ – jessegavin 29 April 2013 в 15:51
  • 2
    @jessegavin действительно. Я должен был упомянуть, что существует множество хороших библиотек es5 shim , которые имитируют функциональность (на всякий случай, если вы хотите поддерживать устаревшие браузеры) – jAndy 29 April 2013 в 15:57
  • 3
    filter() создает новый массив, что прекрасно, если вы можете переназначить переменную и знаете, что нет других областей кода, которые ссылаются на нее. Это не будет работать, если вам необходимо изменить исходный объект массива. – Brian Glick 26 September 2014 в 18:55
  • 4
    Что делать, если массив является древовидной структурой ar beforeDeleteOperationArray = [{«id»: 3.1, «имя» и «тест 3.1», «сведения о действиях»: [{«id»: 22, «name», : "тест 3.1" }, {id ": 23," name ":" измененный тест 23 " }]}], и я хочу удалить id: 23 – forgottofly 18 January 2017 в 12:37
  • 5
    @forgottofly хорошая точка - ответ работает только для ограниченных случаев. Вы нашли ответ на свой вопрос? – JackTheKnife 19 July 2018 в 20:16

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

 var items = [ 
  { "id": 3.1, "name": "test 3.1"}, 
  { "id": 22, "name": "test 3.1" }, 
  { "id": 23, "name": "changed test 23" } 
  ]

    function removeByKey(array, params){
      array.some(function(item, index) {
        return (array[index][params.key] === params.value) ? !!(array.splice(index, 1)) : false;
      });
      return array;
    }

    var removed = removeByKey(items, {
      key: 'id',
      value: 23
    });

    console.log(removed);
0
ответ дан JackTheKnife 15 August 2018 в 18:21
поделиться

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];
var newArray = _.remove(myArray, function(n) {
  return n.value === 'money';;
});
console.log('Array');
console.log(myArray);
console.log('New Array');
console.log(newArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.js"></script>

1
ответ дан Parth Raval 15 August 2018 в 18:21
поделиться

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

С ES6 это так же просто.

myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
7
ответ дан Peracek 15 August 2018 в 18:21
поделиться
  • 1
    Я попробовал это, но вместо «удаления» 3-й элемент из массива OP, ваш код «отфильтрован» и отображает только 3-й элемент. – Compaq LE2202x 30 July 2018 в 12:52

Решение jAndy, вероятно, лучше всего, но если вы не можете полагаться на фильтр, вы можете сделать что-то вроде:

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: "money"}
];

myArray.remove_key = function(key){
    var i = 0, 
        keyval = null;
    for( ; i < this.length; i++){
        if(this[i].field == key){
            keyval = this.splice(i, 1);
            break;
        }
    }
    return keyval;
}
1
ответ дан Rob M. 15 August 2018 в 18:21
поделиться
  • 1
    Почему я не могу полагаться на filter ()? – imperium2335 8 March 2013 в 08:48
  • 2
    Потому что это часть JavaScript 1.6, которая не поддерживается IE8 и ниже или старше браузерами. – Rob M. 8 March 2013 в 09:01
var myArray = [
    {field: 'id', operator: 'eq', value: id}, 
    {field: 'cStatus', operator: 'eq', value: cStatus}, 
    {field: 'money', operator: 'eq', value: money}
];
console.log(myArray.length); //3
myArray = $.grep(myArray, function(element, index){return element.field == "money"}, true);
console.log(myArray.length); //2

Элемент - это объект в массиве. Третий параметр true означает, что будет возвращен массив элементов, который не выполняет вашу логику функции, false означает, что будет возвращен массив элементов, который не выполняет вашу функциональную логику.

2
ответ дан Sandeep sandy 15 August 2018 в 18:21
поделиться
  • 1
    ваше решение кристально чистое. благодаря – Apit John Ismail 6 June 2017 в 15:24

Вот еще один вариант использования jQuery grep. Pass true в качестве третьего параметра, чтобы grep удалял элементы, соответствующие вашей функции.

users = $.grep(users, function(el, idx) {return el.field == "money"}, true)

Если вы уже используете jQuery, тогда не требуется прокладка, которая может быть полезна в отличие от использования Array.filter.

8
ответ дан sifriday 15 August 2018 в 18:21
поделиться

Вы можете использовать lodash's findIndex , чтобы получить индекс конкретного элемента, а затем сплайсировать его.

myArray.splice(_.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);

Обновить

Вы также можете использовать ES6's findIndex ()

Метод findIndex () возвращает индекс первого элемента в массиве, который удовлетворяет предоставленной функции тестирования. В противном случае возвращается -1.

myArray.splice(myArray.findIndex(myArray, function(item) {
    return item.value === 'money';
}), 1);
6
ответ дан Sridhar 15 August 2018 в 18:21
поделиться
  • 1
    Каков массив - это древовидная структура? – forgottofly 18 January 2017 в 12:34
  • 2
    @forgottofly древовидная структура? Я думаю, что myArray здесь представляет собой массив объектов. – Sridhar 18 January 2017 в 13:17
  • 3
    Что делать, если массив представляет собой древовидную структуру var beforeDeleteOperationArray = [{«id»: 3.1, «имя» и «тест 3.1», «сведения о действиях»: [{«id»: 22, «имя», : "тест 3.1" }, {id ": 23," name ":" измененный тест 23 " }]}], и я хочу удалить id: 23 – forgottofly 18 January 2017 в 14:59

Ниже приведен код, если вы не используете jQuery. Демо

var myArray = [
    {field: 'id', operator: 'eq', value: 'id'}, 
    {field: 'cStatus', operator: 'eq', value: 'cStatus'}, 
    {field: 'money', operator: 'eq', value: 'money'}
];

alert(myArray.length);

for(var i=0 ; i<myArray.length; i++)
{
    if(myArray[i].value=='money')
        myArray.splice(i);
}

alert(myArray.length);

Вы также можете использовать библиотеку подчеркивания, в которой есть много функций.

Подчеркивание - это пояс библиотека для JavaScript, которая обеспечивает большую поддержку функционального программирования

4
ответ дан Umair Saleem 15 August 2018 в 18:21
поделиться
  • 1
    Это очень опасный пример для выхода в Интернет ... он работает с данными примера, но не с чем-либо еще. splice (i) означает, что он удалит все элементы в массиве, начиная с и после первого экземпляра, где значение - это деньги, которые не удовлетворяют требованию от op вообще. Если мы изменили на сплайсинг (i, 1), оно все равно было бы неверным, потому что оно не оценило бы следующий последовательный элемент (вам также нужно было бы уменьшить i). Поэтому вы должны обрабатывать операции удаления в массивах назад, чтобы удалить элемент не изменяет индексы следующих элементов для обработки – Chris Schaller 1 August 2016 в 00:46

Итерации через массив, а splice - те, которые вы не хотите. Для более удобного использования повторите итерацию назад, чтобы вам не приходилось учитывать живую природу массива:

for (var i = myArray.length - 1; i >= 0; --i) {
    if (myArray[i].field == "money") {
        myArray.splice(i,1);
    }
}
61
ответ дан user1438038 15 August 2018 в 18:21
поделиться
  • 1
    что вы подразумеваете под живой природой массива? @Neit the Dark Absol – sisimh 1 June 2015 в 12:46
  • 2
    @sisimh он означает, что если вы перебираете вперед по массиву, используя его длину как часть логики итерации, и его длина изменяется, потому что у нее есть элементы, удаленные или добавленные, вы можете завершить работу с концом массива или не выполнять операцию для каждый элемент массива. Возвращение назад делает гораздо менее вероятным, поскольку оно работает с индексом статического 0, а не с движущейся длиной. – Klors 10 July 2015 в 16:14
  • 3
    спасибо за объяснение @Klors :) – sisimh 12 July 2015 в 13:19
  • 4
    Что делать, если массив является древовидной структурой ar beforeDeleteOperationArray = [{«id»: 3.1, «имя» и «тест 3.1», «сведения о действиях»: [{«id»: 22, «name», : "тест 3.1" }, {id ": 23," name ":" измененный тест 23 " }]}], и я хочу удалить id: 23 – forgottofly 18 January 2017 в 12:37
  • 5
    Разумный, но если вы только ожидаете удалить единственный уникальный элемент, вы можете бросить разрыв в оператор «if» для производительности, поэтому цикл не требует излишней итерации по остальной части массива. – Patrick 31 March 2017 в 13:21
Другие вопросы по тегам:

Похожие вопросы: