lodash - 如何 _.trim 对象数组?
lodash - How to _.trim an array of objects?
我正在尝试使用 lodash 的 _.trim
删除 key/value 中的 leading/trailing 空格,如下所示:
var items = [
{"key": " Needs Trim 1 ", "value": " Needs Trim 2 "},
{"key": " Needs Trim 3 ", "value": " Needs Trim 4 "}
];
用 lodash 修剪后应该是这样的:
var items = [
{"key": "Needs Trim 1", "value": "Needs Trim 2"},
{"key": "Needs Trim 3", "value": "Needs Trim 4"}
];
我试过这个:
var trimmedItems = _.map(items, _.trim);
console.log(trimmedItems); // outputs ["[object Object]", "[object Object]"]
但我认为这行不通,因为 console.log(trimmedItems)
没有显示实际对象,所以我不确定它们是否被修剪过。这是显示问题的 fiddle,控制台也应该打开才能看到问题。
知道如何让 fiddle 输出修剪后的 lodash 对象以确保它们被正确修剪吗?
您需要分别 trim key
和 value
。
首先将 _.trim()
应用到一个对象上,天真地将对象转换为字符串,结果是 "[object Object]"
,然后是 trim 这个字符串。
此外,无需使用 lodash,因为 JavaScript 已经在本地提供了所有必要的功能:
var items = [{
"key": " Needs Trim 1 ",
"value": " Needs Trim 2 "
}, {
"key": " Needs Trim 3 ",
"value": " Needs Trim 4 "
}];
var out = items.map(function(item) {
item.key = item.key.trim();
item.value = item.value.trim();
return item;
});
console.log(out);
您需要两级映射。一个用于映射数组,另一个用于将对象的每个属性映射到其值的修剪版本:
_.map(items, function (obj) {
return _.fromPairs(_.map(obj, function (value, key) {
return [key, _.trim(value)]
}))
})
您可以按如下方式使用each()
。
_.each(items, o => _.each(o, (v, k) => o[k] = v.trim()))
第一个 each
将遍历 items
数组,嵌套的 each
将遍历数组中对象的属性。更新 items
数组
中的原始值
o[k] = v.trim()
已使用。其中 o
引用 items
数组中的对象。
对于不支持 ES6 箭头函数的环境
_.each(items, function (o) {
_.each(o, function (v, k) {
o[k] = v.trim();
});
});
var items = [{
"key": " Needs Trim 1 ",
"value": " Needs Trim 2 "
}, {
"key": " Needs Trim 3 ",
"value": " Needs Trim 4 "
}];
_.each(items, o => _.each(o, (v, k) => o[k] = v.trim()))
console.log(items);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>
使用原版 JavaScript:
items.forEach(function(o) {
Object.keys(o).forEach(function(key) {
o[key] = typeof o[key] === 'string' ? o[key].trim() : o[key];
});
});
var items = [{
"key": " Needs Trim 1 ",
"value": " Needs Trim 2 "
}, {
"key": " Needs Trim 3 ",
"value": " Needs Trim 4 "
}];
items.forEach(function (o) {
Object.keys(o).forEach(function (key) {
o[key] = typeof o[key] === 'string' ? o[key].trim() : o[key];
});
});
console.log(items);
Trim + 删除对象(包括嵌套对象)中所有值的白色 space。跳过非字符串值和未定义的值。
const trimObject = (obj) => {
each(obj, (v, k) => {
if (v !== undefined) {
if (isObject(v)) {
obj[k] = trimObject(v)
} else {
obj[k] = typeof v === 'string' ? v.trim().replace(/\s+/g, ' ') : v
}
}
})
return obj
}
映射是解决此问题的正确方法,但我的解决方案比 meagar 的更合适
const items = [
{
key1: " Needs Trim 1 "
, key2: " Needs Trim 2 "
}, {
key1: " Needs Trim 3 "
, key2: " Needs Trim 4 "
}
];
const result = _.map(items, toTrimmedObject);
console.log(JSON.stringify(result, null, 2));
function toTrimmedObject(obj) {
return _.mapValues(obj, _.trim);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
我正在尝试使用 lodash 的 _.trim
删除 key/value 中的 leading/trailing 空格,如下所示:
var items = [
{"key": " Needs Trim 1 ", "value": " Needs Trim 2 "},
{"key": " Needs Trim 3 ", "value": " Needs Trim 4 "}
];
用 lodash 修剪后应该是这样的:
var items = [
{"key": "Needs Trim 1", "value": "Needs Trim 2"},
{"key": "Needs Trim 3", "value": "Needs Trim 4"}
];
我试过这个:
var trimmedItems = _.map(items, _.trim);
console.log(trimmedItems); // outputs ["[object Object]", "[object Object]"]
但我认为这行不通,因为 console.log(trimmedItems)
没有显示实际对象,所以我不确定它们是否被修剪过。这是显示问题的 fiddle,控制台也应该打开才能看到问题。
知道如何让 fiddle 输出修剪后的 lodash 对象以确保它们被正确修剪吗?
您需要分别 trim key
和 value
。
首先将 _.trim()
应用到一个对象上,天真地将对象转换为字符串,结果是 "[object Object]"
,然后是 trim 这个字符串。
此外,无需使用 lodash,因为 JavaScript 已经在本地提供了所有必要的功能:
var items = [{
"key": " Needs Trim 1 ",
"value": " Needs Trim 2 "
}, {
"key": " Needs Trim 3 ",
"value": " Needs Trim 4 "
}];
var out = items.map(function(item) {
item.key = item.key.trim();
item.value = item.value.trim();
return item;
});
console.log(out);
您需要两级映射。一个用于映射数组,另一个用于将对象的每个属性映射到其值的修剪版本:
_.map(items, function (obj) {
return _.fromPairs(_.map(obj, function (value, key) {
return [key, _.trim(value)]
}))
})
您可以按如下方式使用each()
。
_.each(items, o => _.each(o, (v, k) => o[k] = v.trim()))
第一个 each
将遍历 items
数组,嵌套的 each
将遍历数组中对象的属性。更新 items
数组
o[k] = v.trim()
已使用。其中 o
引用 items
数组中的对象。
对于不支持 ES6 箭头函数的环境
_.each(items, function (o) {
_.each(o, function (v, k) {
o[k] = v.trim();
});
});
var items = [{
"key": " Needs Trim 1 ",
"value": " Needs Trim 2 "
}, {
"key": " Needs Trim 3 ",
"value": " Needs Trim 4 "
}];
_.each(items, o => _.each(o, (v, k) => o[k] = v.trim()))
console.log(items);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>
使用原版 JavaScript:
items.forEach(function(o) {
Object.keys(o).forEach(function(key) {
o[key] = typeof o[key] === 'string' ? o[key].trim() : o[key];
});
});
var items = [{
"key": " Needs Trim 1 ",
"value": " Needs Trim 2 "
}, {
"key": " Needs Trim 3 ",
"value": " Needs Trim 4 "
}];
items.forEach(function (o) {
Object.keys(o).forEach(function (key) {
o[key] = typeof o[key] === 'string' ? o[key].trim() : o[key];
});
});
console.log(items);
Trim + 删除对象(包括嵌套对象)中所有值的白色 space。跳过非字符串值和未定义的值。
const trimObject = (obj) => {
each(obj, (v, k) => {
if (v !== undefined) {
if (isObject(v)) {
obj[k] = trimObject(v)
} else {
obj[k] = typeof v === 'string' ? v.trim().replace(/\s+/g, ' ') : v
}
}
})
return obj
}
映射是解决此问题的正确方法,但我的解决方案比 meagar 的更合适
const items = [
{
key1: " Needs Trim 1 "
, key2: " Needs Trim 2 "
}, {
key1: " Needs Trim 3 "
, key2: " Needs Trim 4 "
}
];
const result = _.map(items, toTrimmedObject);
console.log(JSON.stringify(result, null, 2));
function toTrimmedObject(obj) {
return _.mapValues(obj, _.trim);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>