javascript / typescript中的代码减少/重用技术
我有如下数组对象。
var myArray = [
{ id: 20, id1: 'Captain Piett', idn: 2000 },
{ id: 24, id1: null, idn: 5000 },
{ id: 56, id1: 'Admiral Ozzel', idn: 2500 },
{ id: 88, id1: 'Commander Jerjerrod', idn: 1000 }
];
从上面,我想对每个属性执行以下操作。
我可以这样写
对于数字属性
const m = Math.min(...(this.myArray.map(el => el.id)));
const m = Math.max(...(this.myArray.map(el => el.id)));
对于字符串属性
const m = Math.min(...(this.myArray.map(el => el.id1 ? el.id1.length : 0)));
const m = Math.max(...(this.myArray.map(el => el.id1 ? el.id1.length : 0)));
我在myArray中拥有近50个属性。是否有任何代码可重用性技术可以实现这一目标,而不是编写50 * 2语句?
答案 0 :(得分:1)
您不必像使用nav
那样遍历多次,而是可以像这样使用对象一次获得所有最小值和最大值
map()
答案 1 :(得分:0)
keyTypeIdentifier()
返回一个对象,该对象为每个可能的键保存其类型(字符串或数字)作为其值。因此,从那里我们可以根据该值应用我们的字符串或数字的最大值(我尚未添加最小值函数)。因此,我们将所有所有内容放到maxAllKeys
中,并收到一个对象,该对象拥有原始数组中每个键的最大值!
var myArray = [
{ id: 20, id1: 'Captain Piett', idn: 2000 },
{ id: 24, id1: null, idn: 5000 },
{ id: 56, id1: 'Admiral Ozzel', idn: 2500 },
{ id: 88, id1: 'Commander Jerjerrod', idn: 1000 }
];
function keyTypeIdentifier(arr) {
let obj = {}, keys = Object.keys(arr[0]);
for (k of keys) {
let t = arr.find(o => typeof o[k] === "string" || typeof o[k] === "number");
if (t) obj[k] = typeof t[k];
}
console.log(obj)
return obj;
}
function maxAllKeys(arr) {
let keyTypes = keyTypeIdentifier(arr), keys = Object.keys(arr[0]), res = {};
keys.forEach(k => res[k] = keyTypes[k] === "string" ? maxString(arr, k) : maxNumber(arr, k));
return res;
}
function maxString (arr, k) {
return arr.reduce((a,c) => (c[k] && a && a.length > c[k].length) ? a : c[k])
}
function maxNumber (arr, k) {
return arr.reduce((a,c) => a > c[k] ? a : c[k])
}
console.log(maxAllKeys(myArray))
答案 2 :(得分:0)
只需提出一些配置对象。看起来像这样
const config = {
propertyName: string,
propertyType: string,
}
然后有一个函数,可以接收您的数据和这些配置对象的数组...对象中每个属性的一个配置。然后为每种类型的propertyType提供比较功能。当您传递数据和配置时,请根据属性类型选择与switch语句一起使用的比较函数类型。然后将其插入reduce函数中,您将得到想要的东西。有很多遗漏的细节,因为这个问题并不意味着该网站及其涉及的内容,但这就是您的操作方式。
答案 3 :(得分:0)
您可以使用一些函数,并使用所需的键和类型获取数组,然后再使用最小值和最大值。
const
getKey = k => o => o[k],
getLength = k => o => o[k] ? o[k].length : 0;
map = fn => array => array.map(fn);
var myArray = [{ id: 20, id1: 'Captain Piett', idn: 2000 }, { id: 24, id1: null, idn: 5000 }, { id: 56, id1: 'Admiral Ozzel', idn: 2500 }, { id: 88, id1: 'Commander Jerjerrod', idn: 1000 }],
ids = map(getKey('id'))(myArray),
stringLengths = map(getLength('id1'))(myArray);
console.log(Math.min(...ids));
console.log(Math.max(...ids));
console.log(Math.min(...stringLengths));
console.log(Math.max(...stringLengths));