Busque valores en una matriz utilizando bucles para cada JavaScript de Google Apps Script

Oct 26 2020

Tengo un objeto que se parece a la siguiente {clave: números de identificación}

var obj = {
  "c4ecb": {id: [3]},
  "a4269": {id: [34,36]},
  "d76fa": {id: [54,55,60,61]},
  "58cb5": {id: [67]}
}

¿Cómo hago un bucle de cada uno de los anteriores iden la siguiente matriz y devuelvo el label?

var response = 
    {
      "success": true,
      "data": [
        {
          "key": "c4ecb",
          "name": "fruits",
          "options": [
            {
              "label": "strawberry",
              "id": 3
            },
            {
              "label": "apple",
              "id": 4
            },
            {
              "label": "pineapple",
              "id": 5
            },
            {
              "label": "Other",
              "id": 31
            }
          ],
        }
      ]
    },
    {
      "success": true,
      "data": [
        {
          "key": "a4269",
          "name": "vegetables",
          "options": [
            {
              "label": "lettuce",
              "id": 34
            },
            {
              "label": "cucumber",
              "id": 35
            },
            {
              "label": "radish",
              "id": 36
            }
          ],
        }
      ]
    },
    {
      "success": true,
      "data": [
        {
          "key": "d76fa",
          "name": "pasta",
          "options": [
            {
              "label": "spaghetti",
              "id": 54
            },
            {
              "label": "rigatoni",
              "id": 55
            },
            {
              "label": "linguine",
              "id": 56
            },
            {
              "label": "lasagna",
              "id": 60
            },
            {
              "label": "fettuccine",
              "id": 61
            }
          ],
        }
      ]
    }

Finalmente, lo que quiero hacer es buscar la clave y devolver una cadena de valores de identificación. Por ejemplo, entrada c4ecby salida strawberry. Entrada a4269y salida lettuce, radish. Entrada d76fay salida " spaghetti, rigatoni, lasagna, fettuccine"

Creo que para unir la salida de múltiples etiquetas en una cadena, podría usar algo como

array.data.vegetables.map(vegetables => vegetables.value).join(', ')].toString();

Así que al final quiero tener algo como

var fruits = [some code that outputs "strawberry"];
var vegetables = [some code that outputs "lettuce, radish"];
var pasta = [some code that outputs "spaghetti, rigatoni, lasagna, fettuccine"];

Lo que he intentado hasta ahora: el siguiente bucle devolverá el idúnico si hay uno idpara llamar: por ejemplo, solo en el caso de uno donde, {id: 3}pero devuelve nulo en casos como {id: 34,36}(porque está buscando ' 34,36' en id, que no existe - Necesito buscar cada uno individualmente.

response.data.forEach(({key, options}) => {
  if (obj[key]) {
    options.forEach(({id, label}) => {
      if (id == obj[key].id) obj[key].label = label;
    });
  }
});
console.log(obj)

Respuestas

2 DanNagle Oct 26 2020 at 21:31

Filtre el responseobjeto para centrarse en la categoría que coincide con el id. Mapee sobre la optionsmatriz y seleccione los elementos que aparecen en obj[id]. Finalmente, convierta los resultados filtrados en una cadena.

Consulte la filteredLabelsAsString()función a continuación para la implementación.

var obj = {
  "c4ecb": {"id": [3]},
  "a4269": {"id": [34,36]},
  "d76fa": {"id": [54,55,60,61]},
  "58cb5": {"id": [67]}
}

var response = 
    [{
      "success": true,
      "data": [
        {
          "key": "c4ecb",
          "name": "fruits",
          "options": [
            {
              "label": "strawberry",
              "id": 3
            },
            {
              "label": "apple",
              "id": 4
            },
            {
              "label": "pineapple",
              "id": 5
            },
            {
              "label": "Other",
              "id": 31
            }
          ],
        }
      ]
    },
    {
      "success": true,
      "data": [
        {
          "key": "a4269",
          "name": "vegetables",
          "options": [
            {
              "label": "lettuce",
              "id": 34
            },
            {
              "label": "cucumber",
              "id": 35
            },
            {
              "label": "radish",
              "id": 36
            }
          ],
        }
      ]
    },
    {
      "success": true,
      "data": [
        {
          "key": "d76fa",
          "name": "pasta",
          "options": [
            {
              "label": "spaghetti",
              "id": 54
            },
            {
              "label": "rigatoni",
              "id": 55
            },
            {
              "label": "linguine",
              "id": 56
            },
            {
              "label": "lasagna",
              "id": 60
            },
            {
              "label": "fettuccine",
              "id": 61
            }
          ],
        }
      ]
    }];
 
 
 function filteredLabelsAsString(obj_key, obj, content=response) {
    // sanity check: obj must contain obj_key
    if (Object.keys(obj).includes(obj_key)) {
        return content.filter((item) => {
            // filter content using value of obj_key
            return item.data[0].key == obj_key;
        }).map((item) => {
            // item : { success: true, data: [] }
            // map over options array
            return item.data[0].options.map((opt) => {
                // option : {id, label}
                // return the label if the id is in the obj object's list
                if (obj[item.data[0].key].id.includes(opt.id))
                    return opt.label;
            }).filter((label) => {
                // filter out empty items
                return label !== undefined;
            });
        }).join(",");
    }
    // if obj does not contain obj_key return empty string
    return "";
}

console.log("fruits: " + filteredLabelsAsString("c4ecb", obj));

console.log("vegetables: " + filteredLabelsAsString("a4269", obj));

console.log("pasta: " + filteredLabelsAsString("d76fa", obj));