javascript / typescript中的代码减少/重用技术

时间:2019-07-17 09:07:27

标签: javascript angular typescript

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 }
];

从上面,我想对每个属性执行以下操作。

  1. 对于数字col,获取最小值,最大值
  2. 对于字符串col,请获取minLength,maxLength

我可以这样写

对于数字属性

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语句?

4 个答案:

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