从 document/object 中删除特定的键值对
Removing specific key-value pairs from a document/object
我有一个看起来像这样的文档:
{
name: "Johnny Boy",
age: 24,
hobbies: ["fencing", "chess", "raves"],
_createdAt: 2015-05-15T18:12:26.731Z,
_createdBy: "JohnnyBoy",
_id: mQW4G5yEfZtsB6pcN
}
我的目标是 return 所有不以下划线开头的东西 ,并以不同的方式格式化,所以我会这样结束:
[
{
fieldName: "name",
value: "Johnny Boy"
},
{
fieldName: "age",
value: 24
},
{
fieldName: "hobbies",
value: ["fencing", "chess", "raves"]
}
]
我最初的解决方案是 运行 通过 Underscore 库的 _.map
函数(这与我想专门删除下划线无关...)然后使用 lastIndexOf
找出哪些键以下划线开头:
var listWithoutUnderscores = _.map(myList, function(val, key) {
if (key.lastIndexOf("_", 0) === -1)
return {fieldName: key, value: val}
return null
})
然而,这将字面上 return null
而不是 returned 数组中以 _
开头的字段:
[
...
{
fieldname: "hobbies",
value: ["fencing", "chess", "raves"]
},
null,
null,
null
]
我想完全删除它们,最好是在 map
函数本身内,或者通过某种过滤器链接它,但我不知道是哪个在这种情况下,一个是最快的。
Underscore 还带有一个数组方法 compact
,它将从数组中删除所有的假值和空值:
_.compact([0, 1, false, 2, '', null, 3]);
=> [1, 2, 3]
您可以在地图后的数组上调用 _.compact(array)
。
您可以为此使用 reduce:
var listWithoutUnderscores = _.reduce(myList, function(list, val, key) {
if (key.lastIndexOf("_", 0) === -1){
list.push( {fieldName: key, value: val});
}
return list;
}, []);
您可以在这些字段中使用 pick and pass a predicate to get the valid keys and then map:
var validKey = function(value, key){
return _.first(key) != '_';
}
var createField = function(value, key){
return {
fieldname: key,
value: value
}
}
var result = _.chain(data)
.pick(validKey)
.map(createField)
.value();
var data = {
name: "Johnny Boy",
age: 24,
hobbies: ["fencing", "chess", "raves"],
_createdAt: '2015-05-15T18:12:26.731Z',
_createdBy: "JohnnyBoy",
_id: 'mQW4G5yEfZtsB6pcN'
}
var validKey = function(value, key){
return _.first(key) != '_';
}
var createField = function(value, key){
return {
fieldname: key,
value: value
}
}
var result = _.chain(data)
.pick(validKey)
.map(createField)
.value();
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
我有一个看起来像这样的文档:
{
name: "Johnny Boy",
age: 24,
hobbies: ["fencing", "chess", "raves"],
_createdAt: 2015-05-15T18:12:26.731Z,
_createdBy: "JohnnyBoy",
_id: mQW4G5yEfZtsB6pcN
}
我的目标是 return 所有不以下划线开头的东西 ,并以不同的方式格式化,所以我会这样结束:
[
{
fieldName: "name",
value: "Johnny Boy"
},
{
fieldName: "age",
value: 24
},
{
fieldName: "hobbies",
value: ["fencing", "chess", "raves"]
}
]
我最初的解决方案是 运行 通过 Underscore 库的 _.map
函数(这与我想专门删除下划线无关...)然后使用 lastIndexOf
找出哪些键以下划线开头:
var listWithoutUnderscores = _.map(myList, function(val, key) {
if (key.lastIndexOf("_", 0) === -1)
return {fieldName: key, value: val}
return null
})
然而,这将字面上 return null
而不是 returned 数组中以 _
开头的字段:
[
...
{
fieldname: "hobbies",
value: ["fencing", "chess", "raves"]
},
null,
null,
null
]
我想完全删除它们,最好是在 map
函数本身内,或者通过某种过滤器链接它,但我不知道是哪个在这种情况下,一个是最快的。
Underscore 还带有一个数组方法 compact
,它将从数组中删除所有的假值和空值:
_.compact([0, 1, false, 2, '', null, 3]);
=> [1, 2, 3]
您可以在地图后的数组上调用 _.compact(array)
。
您可以为此使用 reduce:
var listWithoutUnderscores = _.reduce(myList, function(list, val, key) {
if (key.lastIndexOf("_", 0) === -1){
list.push( {fieldName: key, value: val});
}
return list;
}, []);
您可以在这些字段中使用 pick and pass a predicate to get the valid keys and then map:
var validKey = function(value, key){
return _.first(key) != '_';
}
var createField = function(value, key){
return {
fieldname: key,
value: value
}
}
var result = _.chain(data)
.pick(validKey)
.map(createField)
.value();
var data = {
name: "Johnny Boy",
age: 24,
hobbies: ["fencing", "chess", "raves"],
_createdAt: '2015-05-15T18:12:26.731Z',
_createdBy: "JohnnyBoy",
_id: 'mQW4G5yEfZtsB6pcN'
}
var validKey = function(value, key){
return _.first(key) != '_';
}
var createField = function(value, key){
return {
fieldname: key,
value: value
}
}
var result = _.chain(data)
.pick(validKey)
.map(createField)
.value();
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>