UnderscoreJS:trim 基于条件的对象数组

UnderscoreJS: trim array of objects based on condition

我有一个 JSON 对象数组,如下所示:

var data = [
  {name: '', age: 12},
  {name: 'bcd', age: 15},
  {name: 'cdf', age: 13},
  {name: '', age: 11},
  {name: 'fgh', age: 8},
  {name: '', age: 10},
];

使用 underscore 我想 trim 这个对象应该 return:

[{name: 'bcd', age: 15},
{name: 'cdf', age: 13},
{name: '', age: 11},
{name: 'fgh', age: 8}]

我尝试使用以下代码:

var firstIndex = _.indexOf(data, _.find(data, function(d){ return d.name !== ''; }));

var lastIndex = _.indexOf(data, _.find(data.slice().reverse(), function(d){ return d.name !== ''; }));

console.log(data.slice(firstIndex, lastIndex + 1) ); 

但我想,应该有比这更好的方法。

这是JSFiddle

编辑:

我希望顶部和底部的所有数据 trimmed 其中名称为空。但不在数组元素的中间。

string.Trim()方法相同。当我在“一二三”文本上应用 trim 时,它将删除开头和结尾的空白 space 但不会删除单词之间的 space 。

看起来你想要 return 没有第一个和最后一个项目的数组,然后使用 slice

var trimmedData = data.slice( 1, data.length - 1 ); 

I want all data from the top and bottom to be trimmed where name is blank. But not in middle of the array element.

定义一个trimLeftFn

var trimLeftFn = arr => {
   var hasValue = false;
   arr = arr.filter( s => {
      hasValue = hasValue || s.name.length > 0;
      return hasValue;
   });
   return arr;
};

var trimmedData = trimLeftFn( trimLeftFn (data ).reverse() ).reverse();

演示

var data = [
  {name: '', age: 12},
  {name: 'bcd', age: 15},
  {name: 'cdf', age: 13},
  {name: '', age: 11},
  {name: 'fgh', age: 8},
  {name: '', age: 10},
];

var trimLeftFn = arr => {
  var hasValue = false;
  arr = arr.filter(s => {
    hasValue = hasValue || s.name.length > 0;
    return hasValue;
  });
  return arr;
};

var trimmedData = trimLeftFn(trimLeftFn(data).reverse()).reverse();

console.log(trimmedData);

你的逻辑没问题,只要在反转数组上使用 _.findLastIndex() 而不是使用 _.findIndex():

const data = [
  {name: '', age: 7},
  {name: '', age: 12},
  {name: 'bcd', age: 15},
  {name: 'cdf', age: 13},
  {name: '', age: 11},
  {name: 'fgh', age: 8},
  {name: '', age: 10},
  {name: '', age: 12},
  {name: '', age: 14},
];

function trimArray(predicate, arr) {
  const start = _.findIndex(arr, predicate);
  const end = _.findLastIndex(arr, predicate);
  
  return arr.slice(start, end + 1);
}

const result = trimArray((o) => o.name !== '', data);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>