Jestem nowy w javascript. powiedzmy, że mam następujący obiekt tablic

const object1 = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
};

Chciałbym utworzyć nowy obiekt, który filtruje dane osób starszych niż wartość (np. 30). Szukałem filtrowania, Object.fromEntries, Object.entries, ale nie mogłem znaleźć możliwego rozwiązania. Wynik powinien być

NewObject {
  name: Array['David', 'Simon', 'Lukas'],
  age: Array[41, 33, 50],
  salary: Array[100, 120, 150]
};

Dzięki za wszelkie sugestie

-1
fuagda 1 kwiecień 2020, 22:28

4 odpowiedzi

Najlepsza odpowiedź

Łatwe do zrozumienia rozwiązanie:

const maxAge = 30;
const object = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
};

const result = { name: [], age: [], salary: [] };

for (let i = 0; i < object.name.length; i++) {
    if (object.age[i] <= maxAge) {
        result.name = [...result.name, object.name[i]];
        result.age = [...result.age, object.age[i]];
        result.salary = [...result.salary, object.salary[i]];
    }
}
console.log(result);
0
Simone Gizzi 1 kwiecień 2020, 19:54

Przekonwertuj obecną strukturę na wygodniejszą strukturę danych (JSON) w następujący sposób:


const workers = [
  {
    name   : 'David',
    age    : 41,
    salary : 100
  },
  {
    name   : 'Juan',
    age    : 22,
    salary : 80
  },
  {
    name   : 'Simon',
    age    : 33,
    salary : 120
  },
  {
    name   : 'Lukas',
    age    : 50,
    salary : 150
  }
];

const olderThan30 = workers.filter(worker => worker.age > 30);

console.log(olderThan30);
// This console log will return this, an array of JSON objects that match the criteria of the filter function.
// [
//  { name : "David", age : 41, salary : 100 },
//  { name : "Simon", age : 33, salary : 120 },
//  { name : "Lukas", age : 50, salary : 150 }
// ]

Mam nadzieję, że to pomoże.

2
yano 1 kwiecień 2020, 21:23

Jak wspomniał @CharlieFish, struktura danych nie jest normalnym sposobem robienia rzeczy, dlatego zamiast tego należy to zrobić:

const employees = [
  { name: 'David', age: 41, salary: 100 },
  { name: 'Simon', age: 33, salary: 120 },
  { name: 'Lukas', age: 50, salary: 150 },
];

const over30 = employees.filter(employee => employee.age > 30);

Jeśli zamiast tego musisz trzymać się swojego wzorca, nadal możesz to zrobić, ale musisz filtrować każdą pojedynczą tablicę:

const isOver30 = (_, i) => object1.age[i] > 30;

const thoseOver30 = {
  name: object1.name.filter(isOver30),
  age: object1.age.filter(isOver30),
  salary: object1.salary.filter(isOver30)
}

... lub mniej duplikatów:

const thoseOver30 = Object
  .entries(object1)
  .map(([prop, array]) => ({ [prop]: array.filter(isOver30) }))
  .reduce((result, props) => Object.assign(result, props), {});
1
Jacob 1 kwiecień 2020, 19:38

Możesz utworzyć jeden obiekt, w którym klucze są indeksami elementów, w których age >= 30, a następnie użyć tego obiektu jako tablicy skrótów do filtrowania.

const data = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
}

const hash = data.age.reduce((r, e, i) => {
  if (e >= 30) r[i] = true;
  return r;
}, {})

for (let i in data) {
  data[i] = data[i].filter((_, j) => hash[j])
}

console.log(data)

Możesz także użyć innej struktury danych, aby uzyskać tablicę obiektów metodą reduce, a następnie po prostu zastosować filtr.

const data = {
  name: ['David', 'Juan', 'Simon', 'Lukas'],
  age: [41, 22, 33, 50],
  salary: [100, 80, 120, 150]
}

const result = Object
  .entries(data)
  .reduce((r, [k, v]) => {
    v.forEach((e, i) => {
      if (!r[i]) r[i] = {}
      r[i][k] = e;
    })

    return r;
  }, [])
  .filter(({ age }) => age >= 30)

console.log(result)
0
Nenad Vracar 1 kwiecień 2020, 19:48