Получение неопределенных значений даже с помощью оператора if - PullRequest
0 голосов
/ 11 апреля 2020

Я поместил значения в массив внутри forEach l oop. Когда я вызываю массив вне l oop, я получаю следующие значения:

d.data:

[{hello: 'abc', asd: '123', fgh: '345' }]
[{sdfg: '123', yo: 'ghj', fgh: '345' }]
[{gd: '123', asd: '123', bonjour: 'yui' }]
[{hello: '123', asd: '567', fgh: '345' }]

forEach L oop:

let str_arr = [];
d.data.forEach(recs => {
  each_keys = Object.keys(recs);
  each_vals = Object.values(recs);
  each_vals.forEach(k => {
    if (typeof k == 'string') {
        find_key = Object.keys(recs).find(key => recs[key] === k);
        str_arr.push(find_key);
    } 
   });
});

str_arr:

["hello", "hello", "hello"]
["yo", "yo", "yo"]
["bonjour", "bonjour", "bonjour"]
[]

console.log(typeof str_arr[0] + ' = ' + str_arr[0]

Результат:

string = hello
string = yo
string = bonjour
undefined = undefined

Я хочу собрать sh всех str_arr [0] внутри одного массива так, Я делаю это?

let string_array = [];
if (str_arr[0] !== undefined) {
    string_array.push(str_arr[0]);
}
console.log(string_array);

Мой результат:

hello
yo
string
     (empty)

Почему я все еще получаю неопределенное значение в моих результатах?

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

input_arr = [
  ["hello", "hello", "hello"],
  ["yo", "yo", "yo"],
  ["bonjour", "bonjour", "bonjour"],
  []
];
let output_array = [];
input_arr.forEach(element => {
  if (element[0] !== undefined) {
    output_array.push(element[0]);
  }
});
console.log(output_array);
console.log(input_arr[3][0] !== undefined); // works as expected
0 голосов
/ 11 апреля 2020

В своем сообщении вы указываете:

d.data:

[{hello: 'abc', asd: '123', fgh: '345' }]
[{sdfg: '123', yo: 'ghj', fgh: '345' }]
[{gd: '123', asd: '123', bonjour: 'yui' }]
[{hello: '123', asd: '567', fgh: '345' }]

Это не имеет смысла, так как это будет 4 уникальных массива, что делает data Массив массивов (с объектами в них). Это будет выглядеть следующим образом:

d.data = [
  [{hello: 'abc', asd: '123', fgh: '345' }],
  [{sdfg: '123', yo: 'ghj', fgh: '345' }],
  [{gd: '123', asd: '123', bonjour: 'yui' }],
  [{hello: '123', asd: '567', fgh: '345' }]
];

Или это должен быть массив объектов, представленный в виде:

d.data = [
  {hello: 'abc', asd: '123', fgh: '345' },
  {sdfg: '123', yo: 'ghj', fgh: '345' },
  {gd: '123', asd: '123', bonjour: 'yui' },
  {hello: '123', asd: '567', fgh: '345' }
];

Я также не могу определить, хотите ли вы иметь строки, содержащие Числа быть целыми числами или строками в объектах. Похоже, вы ищете строки в вашем if(), но то, как они хранятся, все они являются строками.

Предполагая, что последнее и что их нужно рассматривать как числа, а не как строки, я бы предложить использовать $.each() и parseInt().

$(function() {
  var d = {
    data: [{
        hello: 'abc',
        asd: '123',
        fgh: '345'
      },
      {
        sdfg: '123',
        yo: 'ghj',
        fgh: '345'
      },
      {
        gd: '123',
        asd: '123',
        bonjour: 'yui'
      },
      {
        hello: '123',
        asd: '567',
        fgh: '345'
      }
    ]
  };
  var str_arr = [];

  $.each(d.data, function(i, el) {
    console.log(i, el);
    $.each(el, function(k, v) {
      console.log(k + ": " + v);
      if (!(parseInt(v))) {
        console.log("Found String: " + k);
        str_arr.push(k);
      }
    });
  });

  console.log(str_arr.join(", "));
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Здесь мы повторяем каждый элемент (i = индекс массива, el = элемент массива) в массиве. Поскольку элемент является объектом, мы затем вложим в l oop вторую итерацию объекта (k = ключи объекта, v = значения объекта).

Теперь мы можем проверить значение и сохранить Введите ключ str_arr, если он соответствует условиям. Я думаю, что это то, что вы пытались сделать со своим кодом. На самом деле не уверен.

Вы также можете посмотреть, используя .map() или .filter(), они оба тоже смогут это сделать. Возможно, с меньшим количеством строк.

0 голосов
/ 11 апреля 2020

// Results from the forEach loop
var str_arr = 
[
  ["hello", "hello", "hello"], 
  ["yo", "yo", "yo"],
  ["bonjour", "bonjour", "bonjour"],
  []
];

let string_array = []; 

str_arr.forEach(
  function (item_arr)
  {
    if (item_arr[0] !== undefined || item_arr)
    {
      string_array.push(item_arr[0]);
    }
  }
);

// Here's your answer
console.log(string_array);
...