Câu trả lời:
Nếu bạn muốn xóa tất cả các giá trị falsey thì cách nhỏ gọn nhất là:
Đối với Lodash 4.x trở lên :
_.pickBy({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
Đối với di sản Lodash 3.x:
_.pick(obj, _.identity);
_.pick({ a: null, b: 1, c: undefined }, _.identity);
>> Object {b: 1}
false
valu
Bạn có thể chỉ cần xâu chuỗi _.omit()
với _.isUndefined
và các _.isNull
tác phẩm, và nhận được kết quả với đánh giá lười biếng.
var result = _(my_object).omit(_.isUndefined).omit(_.isNull).value();
Cập nhật ngày 14 tháng 3 năm 2016 :
Như được đề cập bởi các dylants trong phần bình luận, bạn nên sử dụng _.omitBy()
hàm vì nó sử dụng một vị ngữ thay vì một thuộc tính. Bạn nên sử dụng điều này cho phiên bản lodash 4.0.0
trở lên.
var result = _(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
Cập nhật ngày 1 tháng 6 năm 2016 :
Theo nhận xét của Max Truxa , lodash đã cung cấp một giải pháp thay thế _.isNil
, kiểm tra cả hai null
và undefined
:
var result = _.omitBy(my_object, _.isNil);
omitBy
chức năng thay vì omit
. Vì vậy_(my_object).omitBy(_.isUndefined).omitBy(_.isNull).value();
omitBy
là ít hiệu suất hơn pickBy
, vì vậy nên ưu tiên thứ hai và điều kiện trong hàm iteratee đảo ngược. Câu trả lời được chấp nhận ở trên đã đúng.
null
và undefined
giá trị. Vị identity
ngữ cũng sẽ loại bỏ false
các giá trị, vì vậy nếu bạn chỉ đơn giản dựa trên ý định của câu hỏi thì tôi không thấy vấn đề gì với câu trả lời của mình. Ngoài ra, nếu chúng ta đang nói về "hiệu suất" , theo mặc định , omitBy
chỉ cần gọi pickBy
với một identity
vị từ phủ định. Vì vậy, về mặt hiệu suất, nó quá nhỏ không đáng kể.
nếu bạn đang sử dụng lodash, bạn có thể sử dụng _.compact(array)
để xóa tất cả các giá trị sai lệch khỏi một mảng.
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
_.pickBy(object, _.isNumber)
trong trường hợp đó.
Đáp án đúng là:
_.omitBy({ a: null, b: 1, c: undefined, d: false }, _.isNil)
Điều đó dẫn đến:
{b: 1, d: false}
Người khác thay thế ở đây:
_.pickBy({ a: null, b: 1, c: undefined, d: false }, _.identity);
Cũng sẽ loại bỏ false
các giá trị không mong muốn ở đây.
{"a":1,"b":{"a":1,"b":null,"c":undefined}}
, thuộc tính object.b b
, 'c' sẽ không bị xóa
Chỉ:
_.omit(my_object, _.isUndefined)
Ở trên không có tài khoản null
giá trị , vì chúng bị thiếu trong ví dụ ban đầu và chỉ được đề cập trong chủ đề, nhưng tôi để nó vì nó thanh lịch và có thể có công dụng của nó.
Dưới đây là ví dụ đầy đủ, ít súc tích, nhưng đầy đủ hơn.
var obj = { a: undefined, b: 2, c: 4, d: undefined, e: null, f: false, g: '', h: 0 };
console.log(_.omit(obj, function(v) { return _.isUndefined(v) || _.isNull(v); }));
_.omitBy
.
Để hoàn thành các câu trả lời khác, trong lodash 4 chỉ bỏ qua không xác định và null (Và không thuộc tính như false
), bạn có thể sử dụng một vị ngữ trong _.pickBy
:
_.pickBy(obj, v !== null && v !== undefined)
Ví dụ dưới đây:
const obj = { a: undefined, b: 123, c: true, d: false, e: null};
const filteredObject = _.pickBy(obj, v => v !== null && v !== undefined);
console.log = (obj) => document.write(JSON.stringify(filteredObject, null, 2));
console.log(filteredObject);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.js"></script>
0
, ''
, false
giá trị. Ngoài ra, bạn có thể rút ngắn cuộc gọi lại v => v != null
.
Đối với đối tượng lồng nhau sâu, bạn có thể sử dụng đoạn mã của tôi cho lodash> 4
const removeObjectsWithNull = (obj) => {
return _(obj)
.pickBy(_.isObject) // get only objects
.mapValues(removeObjectsWithNull) // call only for values as objects
.assign(_.omitBy(obj, _.isObject)) // save back result that is not object
.omitBy(_.isNil) // remove null and undefined from object
.value(); // get value
};
Tôi đã gặp một vấn đề tương tự với việc xóa undefined
khỏi một đối tượng (sâu) và thấy rằng nếu bạn đồng ý chuyển đổi đối tượng cũ đơn giản của mình và sử dụng JSON, một hàm trợ giúp nhanh và bẩn sẽ như thế này:
function stripUndefined(obj) {
return JSON.parse(JSON.stringify(obj));
}
"... Nếu không được xác định, một hàm hoặc ký hiệu gặp phải trong quá trình chuyển đổi, nó sẽ bị bỏ qua (khi nó được tìm thấy trong một đối tượng) hoặc bị kiểm duyệt thành null (khi nó được tìm thấy trong một mảng)."
với JavaScript thuần túy: (mặc dù Object.entries là ES7, Object.assign là ES6; nhưng ES5 tương đương chỉ sử dụng Object.keys cũng có thể thực hiện được); cũng thông báo v != null
kiểm tra cho cả null và không xác định;
> var d = { a:undefined, b:2, c:0, d:undefined, e: null, f: 0.3, s: "", t: false };
undefined
> Object.entries(d)
.filter(([ k, v ]) => (v != null))
.reduce((acc, [k, v]) => Object.assign(acc, {[k]: v}), {})
{ b: 2, c: 0, f: 0.3, s: '', t: false }
Chỉnh sửa: đây là phiên bản chỉ có ES5 Object.keys: nhưng nói chung với ES7 trong Node v8 khá thú vị ;-)
> Object.keys(d)
.filter(function(k) { return d[k] != null; })
.reduce(function(acc, k) { acc[k] = d[k]; return acc; }, {});
{ b: 2, c: 0, f: 0.3, s: '', t: false }
Cập nhật vào tháng 10 năm 2017 : với Node v8 (kể từ v8.3 trở lên) bây giờ nó có cấu trúc trải rộng đối tượng:
> var d = { a:undefined, b:2, c:0, d:undefined,
e: null, f: -0.0, s: "", t: false, inf: +Infinity, nan: NaN };
undefined
> Object.entries(d)
.filter(([ k, v ]) => (v != null))
.reduce((acc, [k, v]) => ({...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
hoặc chỉ trong một lần giảm:
> Object.entries(d)
.reduce((acc, [k, v]) => (v==null ? acc : {...acc, [k]: v}), {})
{ b: 2, c: 0, f: -0, s: '', t: false, inf: Infinity, nan: NaN }
Cập nhật: ai đó muốn đệ quy? cũng không khó lắm, chỉ cần kiểm tra bổ sung isObject và tự gọi đệ quy:
> function isObject(o) {
return Object.prototype.toString.call(o) === "[object Object]"; }
undefined
> function dropNullUndefined(d) {
return Object.entries(d)
.reduce((acc, [k, v]) => (
v == null ? acc :
{...acc, [k]: (isObject(v) ? dropNullUndefined(v) : v) }
), {});
}
> dropNullUndefined({a: 3, b:null})
{ a: 3 }
> dropNullUndefined({a: 3, b:null, c: { d: 0, e: undefined }})
{ a: 3, c: { d: 0 } }
kết luận của tôi: nếu Javascript thuần túy có thể làm được, tôi sẽ tránh mọi phụ thuộc thư viện của bên thứ ba:
Vì một số bạn có thể đã đến lúc các câu hỏi tìm kiếm cụ thể tháo chỉ undefined
, bạn có thể sử dụng:
sự kết hợp của các phương pháp Lodash
_.omitBy(object, _.isUndefined)
các rundef
gói, trong đó loại bỏ chỉ undefined
tính
rundef(object)
Nếu bạn cần loại bỏ đệ quy các undefined
thuộc tính, rundef
gói cũng có một recursive
tùy chọn.
rundef(object, false, true);
Xem tài liệu để biết thêm chi tiết.
Đây là cách tiếp cận lodash tôi sẽ thực hiện:
_(my_object)
.pairs()
.reject(function(item) {
return _.isUndefined(item[1]) ||
_.isNull(item[1]);
})
.zipObject()
.value()
Hàm cặp () biến đối tượng đầu vào thành một mảng các mảng khóa / giá trị. Bạn làm điều này để dễ sử dụng từ chối () để loại bỏ undefined
và null
các giá trị. Sau đó, bạn còn lại các cặp không bị từ chối và đây là các đầu vào cho zipObject () , cấu trúc lại đối tượng của bạn cho bạn.
Có tài khoản mà undefined == null
chúng ta có thể viết như sau:
let collection = {
a: undefined,
b: 2,
c: 4,
d: null,
}
console.log(_.omit(collection, it => it == null))
// -> { b: 2, c: 4 }
Con đường ngắn nhất (lodash v4):
_.pickBy(my_object)
Với lodash (hoặc gạch dưới) Bạn có thể làm
var my_object = { a:undefined, b:2, c:4, d:undefined, e:null };
var passedKeys = _.reject(Object.keys(my_object), function(key){ return _.isUndefined(my_object[key]) || _.isNull(my_object[key]) })
newObject = {};
_.each(passedKeys, function(key){
newObject[key] = my_object[key];
});
Nếu không, với JavaScript vanilla, bạn có thể làm
var my_object = { a:undefined, b:2, c:4, d:undefined };
var new_object = {};
Object.keys(my_object).forEach(function(key){
if (typeof my_object[key] != 'undefined' && my_object[key]!=null){
new_object[key] = my_object[key];
}
});
Không sử dụng thử nghiệm falsey, bởi vì không chỉ "không xác định" hoặc "null" sẽ bị từ chối , mà còn là giá trị falsey khác như "false", "0", chuỗi rỗng, {}. Vì vậy, để làm cho nó đơn giản và dễ hiểu, tôi đã chọn sử dụng so sánh rõ ràng như được mã hóa ở trên.
Để bỏ qua tất cả các giá trị falsey nhưng giữ nguyên các boolean, giải pháp này giúp.
_.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));
let fields = {
str: 'CAD',
numberStr: '123',
number : 123,
boolStrT: 'true',
boolStrF: 'false',
boolFalse : false,
boolTrue : true,
undef: undefined,
nul: null,
emptyStr: '',
array: [1,2,3],
emptyArr: []
};
let nobj = _.omitBy(fields, v => (_.isBoolean(v)||_.isFinite(v)) ? false : _.isEmpty(v));
console.log(nobj);
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>
var my_object = { a:undefined, b:2, c:4, d:undefined };
var newObject = _.reject(my_collection, function(val){ return _.isUndefined(val) })
//--> newCollection = { b: 2, c: 4 }
Tôi sẽ sử dụng dấu gạch dưới và cũng quan tâm đến các chuỗi trống:
var my_object = { a:undefined, b:2, c:4, d:undefined, k: null, p: false, s: '', z: 0 };
var result =_.omit(my_object, function(value) {
return _.isUndefined(value) || _.isNull(value) || value === '';
});
console.log(result); //Object {b: 2, c: 4, p: false, z: 0}
jsbin .
Đối với các đối tượng lồng sâu và mảng. và loại trừ các giá trị trống từ chuỗi và NaN
function isBlank(value) {
return _.isEmpty(value) && !_.isNumber(value) || _.isNaN(value);
}
var removeObjectsWithNull = (obj) => {
return _(obj).pickBy(_.isObject)
.mapValues(removeObjectsWithNull)
.assign(_.omitBy(obj, _.isObject))
.assign(_.omitBy(obj, _.isArray))
.omitBy(_.isNil).omitBy(isBlank)
.value();
}
var obj = {
teste: undefined,
nullV: null,
x: 10,
name: 'Maria Sophia Moura',
a: null,
b: '',
c: {
a: [{
n: 'Gleidson',
i: 248
}, {
t: 'Marta'
}],
g: 'Teste',
eager: {
p: 'Palavra'
}
}
}
removeObjectsWithNull(obj)
kết quả:
{
"c": {
"a": [
{
"n": "Gleidson",
"i": 248
},
{
"t": "Marta"
}
],
"g": "Teste",
"eager": {
"p": "Palavra"
}
},
"x": 10,
"name": "Maria Sophia Moura"
}
Tôi thích sử dụng _.pickBy, vì bạn có toàn quyền kiểm soát những gì bạn đang xóa:
var person = {"name":"bill","age":21,"sex":undefined,"height":null};
var cleanPerson = _.pickBy(person, function(value, key) {
return !(value === undefined || value === null);
});
Nguồn: https://www.codegrepper.com/?search_term=lodash+remove+undDef+values+from+object
Đối với những người bạn đến đây đang tìm cách loại bỏ khỏi một loạt các đối tượng và sử dụng lodash, bạn có thể làm một cái gì đó như thế này:
const objects = [{ a: 'string', b: false, c: 'string', d: undefined }]
const result = objects.map(({ a, b, c, d }) => _.pickBy({ a,b,c,d }, _.identity))
// [{ a: 'string', c: 'string' }]
Lưu ý: Bạn không cần phải hủy nếu bạn không muốn.
_.pickBy(obj, _.identity);