【问题标题】:UnderscoreJS: trim array of objects based on conditionUnderscoreJS:根据条件修剪对象数组
【发布时间】:2018-03-22 05:58:25
【问题描述】:

我有一个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() 方法相同。当我对“一二三”文本应用修剪时,它会从开头和结尾删除空格,但不会删除单词之间的空格。

【问题讨论】:

  • 返回对象的逻辑是什么
  • 你想要 11 岁的空白名字吗?
  • 您想从数组中删除第一项和最后一项?
  • @gurvinder372 我已经更新了问题并提到了它应该返回的内容。
  • @brk 我更新了问题并提到了它应该返回的内容。

标签: javascript arrays json filter underscore.js


【解决方案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>

【讨论】:

  • 感谢您的建议。我知道肯定有比我申请的更好的解决方案:)
【解决方案2】:

看起来你想返回没有第一项和最后一项的数组,然后使用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();

演示

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2018-10-04
    • 2019-04-05
    • 2019-06-13
    相关资源
    最近更新 更多