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; (); // карты из имени атрибута в значение}
Одна возможность:
myArray = myArray.filter(function( obj ) {
return obj.field !== 'money';
});
Обратите внимание, что filter
создает новый массив. Любые другие переменные, относящиеся к исходному массиву, не будут получать отфильтрованные данные, хотя вы обновляете исходную переменную myArray
с помощью новой ссылки. Используйте с осторожностью.
На основании некоторых комментариев, приведенных ниже, приведен код, как удалить объект на основе имени ключа и значения ключа
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);
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>
Предположим, вы хотите удалить второй объект по свойству поля.
С ES6 это так же просто.
myArray.splice(myArray.findIndex(item => item.field === "cStatus"), 1)
Решение 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;
}
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
означает, что будет возвращен массив элементов, который не выполняет вашу функциональную логику.
Вот еще один вариант использования jQuery grep. Pass true
в качестве третьего параметра, чтобы grep удалял элементы, соответствующие вашей функции.
users = $.grep(users, function(el, idx) {return el.field == "money"}, true)
Если вы уже используете jQuery, тогда не требуется прокладка, которая может быть полезна в отличие от использования Array.filter
.
Вы можете использовать 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);
myArray
здесь представляет собой массив объектов.
– Sridhar
18 January 2017 в 13:17
Ниже приведен код, если вы не используете 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, которая обеспечивает большую поддержку функционального программирования
Итерации через массив, а splice
- те, которые вы не хотите. Для более удобного использования повторите итерацию назад, чтобы вам не приходилось учитывать живую природу массива:
for (var i = myArray.length - 1; i >= 0; --i) {
if (myArray[i].field == "money") {
myArray.splice(i,1);
}
}
filter()
доступен только для Internet Explorer 9+ – jessegavin 29 April 2013 в 15:51filter()
создает новый массив, что прекрасно, если вы можете переназначить переменную и знаете, что нет других областей кода, которые ссылаются на нее. Это не будет работать, если вам необходимо изменить исходный объект массива. – Brian Glick 26 September 2014 в 18:55