Почему мои массивы не обновляются так, как должны, когда я перебираю объект?Javascript - PullRequest
0 голосов
/ 05 июня 2018

Я пытаюсь просмотреть массив объектов и, учитывая свойство типа определенного объекта, сохранить этот объект в массиве

Если у меня есть:

data = [
  {type: "recare", value: "Hello", ... },
  {type: "tocall", value: "World", ... },
  {type: "recare", value: "People", ...}
];

иэто мой код:

var recare = [];
var toCall = [];

data.map(function(k) {
  console.log(k.reason)
  if (k.type == 'recare') {
    recare[k] = k
    console.log("recare", recare)
  } else if (k.type == 'tocall') {
    toCall[k] = k
    console.log("tocall", toCall)
  }
});

Я не уверен, почему, но объекты не сохраняются правильно, как они должны.Поскольку существует более одного recare, в массиве должны быть обе записи, но отображается только последняя. Что я сделал неправильно?

Ответы [ 5 ]

0 голосов
/ 05 июня 2018

Первым аргументом, переданным обратному вызову карты, является элемент, а не его индекс.
Аргументы, передаваемые карте, находятся в следующем порядке элемент данных , индекс , array .
А также ваш элемент является объектом, а не целым числом, поэтому его нельзя использовать в качестве индекса.
Вы можете использовать метод push для вставки элементов вконец желаемого массива.

data.map(function(k){ 
       if (k.type =='recare') { 
           recare.push(k)
       } else if(k.type == 'tocall'){
             toCall.push(k)
       } });
0 голосов
/ 05 июня 2018

if (k.type == 'recare') { recare.push( k ); console.log("recare", recare) }

Это должно привести к тому, что ваши объекты будут помещены в массив в конце, давая вам числовые индексы в массиве, которые, как я полагаю, являются вашими намерениями.

0 голосов
/ 05 июня 2018

Изменить recare[k] = k на recare.push(k)

k - это объект, поэтому его нельзя использовать в качестве индекса.

0 голосов
/ 05 июня 2018

Вы можете передать значение (e) функции обратного вызова .map().Затем проверьте, равен ли e.type recare или tocall и .push() значению для правильного массива.

Вот рабочий код:

const data = [
  {type: "recare", value: "Hello"},
  {type: "tocall", value: "World"},
  {type: "recare", value: "People"}
]

let recare = [];
let toCall = [];

data.map(e => {
  if(e.type == 'recare') {
    recare.push(e.value)
  } else if(e.type == 'tocall') {
    toCall.push(e.value)
  }
});

console.log(recare)
console.log(toCall)

Вы также можете использовать другую структуру данных: например, иметь в качестве результата объект, содержащий два массива в качестве значений ключей recare и tocall, следующим образом:

let result = {recare: [], tocall: []}

Тогда оператор map будет намного короче:

data.map(e => result[e.type].push(e.value));

const data = [
  {type: "recare", value: "Hello"},
  {type: "tocall", value: "World"},
  {type: "recare", value: "People"}
]

let result = {recare: [], tocall: []}

data.map(e => result[e.type].push(e.value));

console.log(result)
0 голосов
/ 05 июня 2018

Вы не можете сделать это так recare[k], что означает, что вы устанавливаете ключ массива для объекта, который недопустим, вы можете использовать push метод Array для вставки данных или использовать i из map функция для push на той же позиции, что и в оригинале array

var data = [
  {type: "recare", value: "Hello" },
  {type: "tocall", value: "World" },
  {type: "recare", value: "People"}
];
var recare = [];
var toCall = [];

 data.map(function(k,i) {
  if (k.type == 'recare') {
    recare.push(k);
  } else if (k.type == 'tocall') {
     toCall.push(k);
  }
});

console.log("recare ---------");
console.log(recare);
console.log("toCall---------");
console.log(toCall);

У вас есть несколько других опций, которые вы можете использовать как forEach и filter * Цикл 1013 *

forEach и for хорошо подходит для массивов, в вашем использовании-case карта не для этого типа работы. Она выглядит так же, как forEach, но используется для в таких условиях, когда вы хотите манипулировать массивом и хотите вернуть тот же массив в результате с модификацией

Для того, как у вас есть Array

var sample = ["a","b","c","d"];

и вы хотите append "z" во всех index

sample  = sample.map(val=>(val+"z"));

результат

["az","bz","cz","dz"]

фильтр будет лучшим выбором, которыйвернуть то, что вы ищете

var recare = data.filter(function(k){ return k.type == "recare" });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...