Оператором xor является ^
Например: SELECT A ^ B
, где A и B являются целыми типами данных категории.
РЕДАКТИРОВАНИЕ: на Этот вопрос ответили почти 9-летний назад, когда не было очень полезных встроенных методов в Array.prototype
.
Теперь, конечно, я просто рекомендовал бы Вам использовать filter
метод.
Берут в памяти, что этот метод возвратит Вас новый массив с элементами, которые передают критерии функции обратного вызова, которую Вы предоставляете ему, например, если Вы хотите удалить null
или undefined
значения:
var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];
var filtered = array.filter(function (el) {
return el != null;
});
console.log(filtered);
Это будет зависеть от того, что Вы считаете "пустыми", например, если бы Вы имели дело со строками, вышеупомянутая функция не удалила бы элементы, которые являются пустой строкой.
Один общий шаблон, который я часто вижу используемый, должен удалить элементы, которые являются falsy, которые включают пустую строку ""
, 0
, NaN
, null
, undefined
, и false
.
можно просто передать filter
метод, Boolean
функция конструктора, или просто возвратить тот же элемент в функции критериев фильтра, например:
var filtered = array.filter(Boolean);
Или
var filtered = array.filter(function(el) { return el; });
обоими способами это работает, потому что filter
метод в первом случае, вызовы Boolean
конструктор как функция, преобразовывая значение, и во втором случае, filter
метод внутренне преобразовывает возвращаемое значение обратного вызова неявно к [1 121].
, Если Вы работаете с разреженными массивами, и Вы пытаетесь избавиться от "дыр", можно просто использовать filter
метод, передающий обратный вызов, который возвращает true, например:
var sparseArray = [0, , , 1, , , , , 2, , , , 3],
cleanArray = sparseArray.filter(function () { return true });
console.log(cleanArray); // [ 0, 1, 2, 3 ]
Старый ответ: не делают этого!
я использую этот метод, расширяя собственный прототип Массива:
Array.prototype.clean = function(deleteValue) {
for (var i = 0; i < this.length; i++) {
if (this[i] == deleteValue) {
this.splice(i, 1);
i--;
}
}
return this;
};
test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);
Или можно просто продвинуть существующие элементы в другой массив:
// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
var newArray = new Array();
for (var i = 0; i < actual.length; i++) {
if (actual[i]) {
newArray.push(actual[i]);
}
}
return newArray;
}
cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);
Попробуйте это. Передайте его Ваш массив, и это возвратится с пустыми удаленными элементами. *Обновленный для обращения к ошибке, на которую указывает Jason
function removeEmptyElem(ary) {
for (var i = ary.length - 1; i >= 0; i--) {
if (ary[i] == undefined) {
ary.splice(i, 1);
}
}
return ary;
}
Можно найти легче циклично выполниться по массиву и создать новый массив из объектов, которые Вы хотите удержаться от массива, чем путем попытки циклично выполнить и соединить, как был предложен, начиная с изменения длины массива, в то время как это циклично выполняется, может представить проблемы.
Вы могли сделать что-то вроде этого:
function removeFalsyElementsFromArray(someArray) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(someArray[index]) {
newArray.push(someArray[index]);
}
}
return newArray;
}
На самом деле вот более универсальное решение:
function removeElementsFromArray(someArray, filter) {
var newArray = [];
for(var index = 0; index < someArray.length; index++) {
if(filter(someArray[index]) == false) {
newArray.push(someArray[index]);
}
}
return newArray;
}
// then provide one or more filter functions that will
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
return (item == null || typeof(item) == "undefined");
}
// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);
// results == [1,2,3,3,4,4,5,6]
Вы получаете идею - у Вас могли тогда быть другие типы функций фильтра. Вероятно, больше, чем Вы нужно, но я чувствовал себя щедрым...;)
Это работает, я протестировал его в AppJet (Вы можете вставка копии код его IDE и нажимать "перезагрузку", чтобы видеть, что он работает, не должен создавать учетную запись)
/* appjet:version 0.1 */
function Joes_remove(someArray) {
var newArray = [];
var element;
for( element in someArray){
if(someArray[element]!=undefined ) {
newArray.push(someArray[element]);
}
}
return newArray;
}
var myArray2 = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/
Если у Вас есть Javascript 1.6, или позже можно использовать Array.filter
использование тривиального return true
функция обратного вызова, например:
arr = arr.filter(function() { return true; });
с тех пор .filter
автоматически пропуски недостающие элементы в исходном массиве.
страница MDN, связанная выше также, содержит хорошую версию проверки ошибок filter
, который может использоваться в интерпретаторах JavaScript, которые не поддерживают официальную версию.
Примечание, которое это не удалит null
записи, ни записи с явным undefined
значение, но OP конкретно требуемые "недостающие" записи.
@Alnitak
На самом деле Array.filter работает над всеми браузерами, если Вы добавляете некоторый дополнительный код. Посмотрите ниже.
var array = ["","one",0,"",null,0,1,2,4,"two"];
function isempty(x){
if(x!=="")
return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]
Это - код, который необходимо добавить для IE, но фильтр и Функциональная programmingis ценность являются imo.
//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license
if (!Array.prototype.filter)
{
Array.prototype.filter = function(fun /*, thisp*/)
{
var len = this.length;
if (typeof fun != "function")
throw new TypeError();
var res = new Array();
var thisp = arguments[1];
for (var i = 0; i < len; i++)
{
if (i in this)
{
var val = this[i]; // in case fun mutates this
if (fun.call(thisp, val, i, this))
res.push(val);
}
}
return res;
};
}
Фильтрация недопустимых записей с помощью регулярного выражения
array = array.filter(/\w/);
filter + regexp
var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];
arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Number)
// [1, 2, 3, -3, 4, 4, 5, 6]
arr.filter(Boolean)
// [1, 2, 3, -3, 4, 4, 5, 6]
или - (только для одиночных элементов массива типа "текст")
['','1','2',3,,'4',,undefined,,,'5'].join('').split('');
// output: ["1","2","3","4","5"]
или - Классический способ: простая итерация
var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
len = arr.length, i;
for(i = 0; i < len; i++ )
arr[i] && arr.push(arr[i]); // copy non-empty values to the end of the array
arr.splice(0 , len); // cut the array and leave only the non-empty values
arr // [1,2,3,3,[],Object{},5,6]
var arr = [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,];
arr = $.grep(arr,function(n){ return n == 0 || n });
arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]
var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,],
temp = [];
for(let i of arr)
i && temp.push(i); // copy each non-empty value to the 'temp' array
arr = temp;
arr // [1, 2, 3, 3, 4, 4, 5, 6]
['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)
// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]