Почему я не могу отфильтровать свой массив JSON в d3. js? - PullRequest
1 голос
/ 02 августа 2020

Работая в d3. js, мои данные выглядят примерно так (но намного длиннее):

var all = [{
"tp_ot_avg": 0.003,
"tp_ot_s": 24.7,
"tp_overlap_pc_s": 45.7,
"tp_ot_avg_s": 0.005,
"sw_adult": 74,
"sw_overlap": 6,
"sw_child": 7,
"sw_pause": 13
}];

Я хочу отфильтровать их по имени ключа; желаемый результат:

var data = {
"sw_adult": 74,
"sw_overlap": 6,
"sw_child": 7,
"sw_pause": 13
};

Пока ничего из того, что я пробовал, не сработало!

ПОПЫТКА 1:

var data = all.filter(function (a) {
  return (
    a.key == "sw_adult" ||
    a.key == "sw_child" ||
    a.key == "sw_overlap" ||
    a.key == "sw_pause"
  );
});

ПОПЫТКА 2:

tokeep = ["sw_adult", "sw_child", "sw_overlap", "sw_pause"]
var data = all.filter(function(d,i){ return tokeep.indexOf(d.key) >= 0 })

ПОПЫТКА 3:

var data = d3.selectAll("all").filter(
    all.key == "sw_adult" ||
    all.key == "sw_child" ||
    all.key == "sw_overlap" ||
    all.key == "sw_pause"
  );

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 02 августа 2020

Вы были в правильном направлении, просто filter ключи, которые вам нужны.

Итерации по массиву all на каждой итерации проверяйте его записи, используя Object.entries является ли текущий объект has the keys or not, если он извлек его, используя Object.fromEntries, и прервет поток, как только вы найдете желаемый объект.

var all = [{
    "tp_ot_avg": 0.003,
    "tp_ot_s": 24.7,
    "tp_overlap_pc_s": 45.7,
    "tp_ot_avg_s": 0.005,
    "sw_adult": 74,
    "sw_overlap": 6,
    "sw_child": 7,
    "sw_pause": 13
  },
  {
    "tp_ot_avg": 0.003,
    "tp_ot_s": 24.7,
    "tp_overlap_pc_s": 45.7,
    "tp_ot_avg_s": 0.005
  }
];

const keys = ['sw_adult', 'sw_overlap', 'sw_child', 'sw_pause'];
let resObj;

for (const item of all) {
  const filteredEntries = Object.entries(item).filter(([key, value]) => keys.includes(key));
  if (filteredEntries.length) {
    resObj = Object.fromEntries(filteredEntries);
    break;
  }
}

console.log(resObj);
1 голос
/ 02 августа 2020

Если весь ваш массив содержит только один объект, вы можете просто сделать это.

const keys = ["sw_adult", "sw_overlap", "sw_child", "sw_pause"];
const all = [{
  "tp_ot_avg": 0.003,
  "tp_ot_s": 24.7,
  "tp_overlap_pc_s": 45.7,
  "tp_ot_avg_s": 0.005,
  "sw_adult": 74,
  "sw_overlap": 6,
  "sw_child": 7,
  "sw_pause": 13
}];

const output = Object.keys(all[0]).reduce((result, current) => {
  if (keys.includes(current)) {
    result[current] = all[0][current];
  }
  return result;
}, {});
console.log(output);

И есть вероятность, что весь массив может иметь несколько объектов, тогда вы можете сделать это.

const keys = ["sw_adult", "sw_overlap", "sw_child", "sw_pause"];
const all = [{
  "tp_ot_avg": 0.003,
  "tp_ot_s": 24.7,
  "tp_overlap_pc_s": 45.7,
  "tp_ot_avg_s": 0.005,
  "sw_adult": 74,
  "sw_overlap": 6,
  "sw_child": 7,
  "sw_pause": 13
}, {
  "tp_ot_avg": 0.003,
  "tp_ot_s": 24.7,
  "tp_overlap_pc_s": 45.7,
  "tp_ot_avg_s": 0.005,
  "sw_adult": 742,
  "sw_overlap": 62,
  "sw_child": 72,
  "sw_pause": 132
}];

const output = all.map((a) => Object.keys(a).reduce((result, current) => {
  if (keys.includes(current)) {
    result[current] = a[current];
  }
  return result;
}, {}));
console.log(output);
0 голосов
/ 02 августа 2020

Предпринимаются попытки отфильтровать объект массива, а не ключи объекта. Попробуйте:

var all = [{
  "tp_ot_avg": 0.003,
  "tp_ot_s": 24.7,
  "tp_overlap_pc_s": 45.7,
  "tp_ot_avg_s": 0.005,
  "sw_adult": 74,
  "sw_overlap": 6,
  "sw_child": 7,
  "sw_pause": 13
}];


// destruct the properties and return a new object
const output = all.map(({
  sw_adult,
  sw_child,
  sw_overlap,
  sw_pause
}) => ({
  sw_adult,
  sw_child,
  sw_overlap,
  sw_pause
}))

// Shorter and uses a list of keys to pick
const keys = ["sw_adult","sw_overlap","sw_child","sw_pause"];
// return a new object from merging objects created by { key: value }
const output2 = all.map(o =>
   Object.assign({}, ...keys.map(k => ({ [k]: o[k] })))
);

console.log(output2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...