从 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>