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>
我有一个 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>