UnderscoreJS:根据条件修剪对象数组

时间:2018-03-22 05:58:25

标签: javascript arrays json filter underscore.js

我有一个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我想以这样一种方式修剪这个对象:

[{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

修改:

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

string.Trim()方法相同。当我在"一二三"文本,它将从开始和结束删除空格,但不删除单词之间的空格。

2 个答案:

答案 0 :(得分:1)

看起来你想要在没有第一个和最后一个项目的情况下返回数组,然后使用slice

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

我希望顶部和底部的所有数据都被修剪到名称所在的位置   空白。但不是在数组元素的中间。

定义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();

<强>演示

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

您的逻辑很好,只需使用_.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>