根据长度相同的另一个数组中的值过滤一个数组

时间:2019-02-26 13:43:28

标签: javascript

我得到了一系列代表人的数据的对象。我需要过滤名称,当在它们的名字中添加所有字符的ASCII表示形式时,结果将是一个奇数。 例如:“ Aba”中字母的ASCII码总和为:65 + 98 + 97 = 260,这是一个偶数-过滤掉

我的逻辑如下:

  1. 获取名字;
  2. 将每个名字的字母转换为ASCII码;
  3. 添加每个名称的ASCII码;
  4. 检查接收到的数字是否为奇数;
  5. 返回名称,其中ASCII码为奇数。

我已经完成了上述4个任务,但我不知道如何连接来自不同阵列的项目。 例如:我有一个名称数组:let names = ['Aba', 'Abb']和一个奇/偶数数组:let oddEven = [0, 1]

我该如何做:

1)名称[0]是奇数甚至是[0]

2)if oddEven [0]> 0 {过滤掉}吗?

谢谢

我的代码:

function findOddNames(list) {

  let names = list.map((name) => name.firstName);
  let splittedNames = names.map((name) => name.split(''));
  let charCodes = splittedNames.map((arr) => arr.map((letter) => letter.charCodeAt(0)));
  let charCodesTotal = charCodes.map((arr) => arr.reduce((a, b) => a + b, 0));
  let oddEven = charCodesTotal.map((item) => item % 2);    
};

findOddNames([
  { firstName: 'Aba', lastName: 'N.', country: 'Ghana', continent: 'Africa', age: 21, language: 'Python' },
  { firstName: 'Abb', lastName: 'O.', country: 'Israel', continent: 'Asia', age: 39, language: 'Java' }
])

3 个答案:

答案 0 :(得分:1)

您可以像这样使用 filter oddEven具有模值。仅filter个来自names数组的索引,这些索引具有非零的oddEven值。要获得偶数值,请使用oddEven[i] === 0

function findOddNames(list) {
  let names = list.map((name) => name.firstName);
  let splittedNames = names.map((name) => name.split(''));
  let charCodes = splittedNames.map((arr) => arr.map((letter) => letter.charCodeAt(0)));
  let charCodesTotal = charCodes.map((arr) => arr.reduce((a, b) => a + b, 0));
  let oddEven = charCodesTotal.map((item) => item % 2);
  let oddNames = names.filter((n, i) => oddEven[i] !== 0)
  return oddNames;
};

const odd = findOddNames([
  { firstName: 'Aba', lastName: 'N.', country: 'Ghana', continent: 'Africa', age: 21, language: 'Python' },
  { firstName: 'Abb', lastName: 'O.', country: 'Israel', continent: 'Asia', age: 39, language: 'Java' }
])

console.log(odd)

答案 1 :(得分:0)

此替代方法使用函数filter仅获得奇数名称,并使用函数reduce对每个字母的ASCII码求和,最后使用运算符%检查是否为和。偶数或奇数。

let findOddNames = (arr) => {
  return arr.filter(({firstName}) => {
    return firstName.split('').reduce((a, letter) => letter.charCodeAt(0) + a, 0) % 2;
  });
};

let result = findOddNames([
  { firstName: 'Aba', lastName: 'N.', country: 'Ghana', continent: 'Africa', age: 21, language: 'Python' },
  { firstName: 'Abb', lastName: 'O.', country: 'Israel', continent: 'Asia', age: 39, language: 'Java' }
]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

为什么不使用.filter而不创建单独的数组来保存输入数组的每个变体。

下面,我使用.filter将输入数组过滤到findOddNames数组中。如果要在使用过滤器时保留给定元素,则需要返回true,如果不想保留它(即firstName的和为偶数),则可以返回{{ 1}}。

在过滤器功能中,我还使用了destructuring assignment,这使我可以轻松地从输入数组中提取false属性。我还使用了spread syntax。这是将字符串转换为字符数组的简便方法。最后,我在数组上使用了.reduce以获取数组中所有字符的总和。

请参见以下示例:

firstName