【问题标题】:Multi selection from dictionary从字典中多选
【发布时间】:2020-04-15 00:26:58
【问题描述】:

我想同时从具有多个键的数组中进行选择。 这是我的字典:

var votes = {
"abreudia":{"ACDA":["alex"],"ANG":["lou"],"APL":["lea"],"ART":["cecile"],"ASR":["def"],"EC":["abc"],"EGOD":...,
"lou":{"ACDA":["abc"],"ANG":["def"],"APL":["hig"],"ART":["azerty"],"ASR":["def"],"EC":["abc"],"EGOD":...,

到目前为止,这是我的代码:

var numChecked = 0;
var request = [];

  function checkSelected(selected) {
    if (selected.checked == true) {
      request.push(selected.value);
      numChecked += 1;
    } else if (selected.checked == false) {
      var index = request.indexOf(selected.value);
      if (index !== -1) request.splice(index, 1);
      numChecked -= 1;
    }
    console.log(
      "selected : ",
      selected.value,
      "request : ",
      request,
      "numChecked : ",
      numChecked
    );

    for (var key in votes) {
      if (votes.hasOwnProperty(key)) {
        console.log(key, votes[key][request]);
      }
    }

例如,当我选择“ASR”时,一切都很好,输出是只有“ASR”的字典。像这样:

"abreudia":"alex","lou":"abc",...
request :  ["ASR"]

如果我做多个选择,请求看起来像:

request :  ["ASR, ANG"]

最后,我想要这样的输出,例如:

"abreudia":{"def", "lou"},"lou":{"def","def"},...

【问题讨论】:

  • 原始值中的所有内容都在长度为 1 的数组中是否有原因?
  • 不,每个数组可以有多个元素

标签: javascript arrays sorting dictionary


【解决方案1】:

听起来你正在寻找这样的东西:

var v = {
  "abreudia":{"ACDA":["alex"],"ANG":["lou"],"APL":["lea"],"ART":["cecile"],"ASR":["def"] },
  "lou":{"ACDA":["abc"],"ANG":["def"],"APL":["hig"],"ART":["azerty"],"ASR":["def"],"EC":["abc"] }
};

function processRequest(votes, request) {
  var entries = Object.entries(votes)
    .map(function (entry) {
      return [
        entry[0],
        request.map(function (e) { return entry[1][e]; }).flat(),
      ];
    });
    
  return Object.fromEntries(entries);
}

console.log(processRequest(v, ['APL']));

console.log(processRequest(v, ['ASR', 'ANG']));

或者使用 ES6 语法:

var v = {
  "abreudia":{"ACDA":["alex"],"ANG":["lou"],"APL":["lea"],"ART":["cecile"],"ASR":["def"] },
  "lou":{"ACDA":["abc"],"ANG":["def"],"APL":["hig"],"ART":["azerty"],"ASR":["def"],"EC":["abc"] }
};

const processRequest = (votes, request) =>
  Object.fromEntries(
    Object.entries(votes)
      .map(([key, value]) => [key, request.map(e => value[e]).flat()])
  );
  
console.log(processRequest(v, ['APL']));

console.log(processRequest(v, ['ASR', 'ANG']));

最后,使用 ES6 和 objectMap() 辅助函数在一行中完成整个过程:

var v = {
  "abreudia":{"ACDA":["alex"],"ANG":["lou"],"APL":["lea"],"ART":["cecile"],"ASR":["def"] },
  "lou":{"ACDA":["abc"],"ANG":["def"],"APL":["hig"],"ART":["azerty"],"ASR":["def"],"EC":["abc"] }
};

// general-purpose helper function
const objectMap = (obj, fn) =>
  Object.fromEntries(
    Object.entries(obj).map(
      ([k, v], i) => [k, fn(v, k, i)]
    )
  );

const processRequest = (votes, request) =>
  objectMap(votes, items => request.map(e => items[e]).flat());
  
console.log(processRequest(v, ['APL']));

console.log(processRequest(v, ['ASR', 'ANG']));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2023-03-05
    • 2016-04-14
    相关资源
    最近更新 更多