Как получить массив объектов только в том случае, если значения массива совпадают с ключом массива объектов

#javascript #arrays #loops #object

Вопрос:

У меня есть массив arr1, arr2, arr3 и массив объектов objarr

Я хотел бы получить массив объектов на основе условия

т. е. при передаче arr1 массив объектов objarr должен возвращать только совпадающие ключи arr1

т. е. при передаче arr2 массив объектов objarr должен возвращать только совпадающие ключи arr2 (если wrk передан параметр, только покажите, что это правда )

т. е. при передаче arr3 массив объектов objarr должен возвращать только совпадающие ключи arr3

 var arr1=["name", "place"]
var arr2=["details", "wrk"]
var arr3=["name"]

var objarr=[
  {id:1, name: "ayan", place: "MY", details: "finance" , wrk: true},
  {id:2, name: "mike", place: "AU", details: "teaching", wrk: false },
  {id:3, name: "john", place: "DE", details: "service" , wrk: true}
]

function outputData(arr1){
  var final=[];
  var result = objarr.map(e=>{
   if(arr1.includes(Object.keys(e)){
    final.push(e)
   }
  })

return  final
;}

Expected Output;
//for arr1 is passed
[
  {name: "ayan", place: "MY"},
  {name: "mike", place: "AU"},
  {name: "john", place: "DE"}
]

//for arr2 is passed
[
  {details: "finance", wrk:true},
  {details: "service", wrk: true}
]

//for arr3 is passed
[
  {name: "ayan"},
  {name: "mike"},
  {name: "john"}
]
 

Ответ №1:

 var arr1 = ["name", "place"];
var arr2 = ["details", "wrk"];
var arr3 = ["name"];

var objarr = [
  { id: 1, name: "ayan", place: "MY", details: "finance", wrk: true },
  { id: 2, name: "mike", place: "AU", details: "teaching", wrk: false },
  { id: 3, name: "john", place: "DE", details: "service", wrk: true }
]

function outputData(arr) {
  var final = [];
  objarr.forEach(obj => {
      const temp = {};
      arr.forEach(key => {
          if(obj[key]){
              temp[key]= obj[key];
          }
      });
      if(Object.keys(temp).length===arr.length){
      final.push(temp);}
  });

  return final;
}
console.log('arr1',outputData(arr1));
console.log('arr2',outputData(arr2));
console.log('arr3',outputData(arr3)); 

Ответ №2:

Вы можете легко достичь результата, используя reduce и for..of loop

 var arr1 = ["name", "place"];
var arr2 = ["details", "wrk"];
var arr3 = ["name"];

var objarr = [
  { id: 1, name: "ayan", place: "MY", details: "finance", wrk: true },
  { id: 2, name: "mike", place: "AU", details: "teaching", wrk: false },
  { id: 3, name: "john", place: "DE", details: "service", wrk: true },
];

function getData(target, source) {
  return target.reduce((acc, curr) => {
    const obj = {};
    for (let prop of source) {
      obj[prop] = curr[prop];
    }
    if (Object.keys(obj).includes("wrk")) {
      if (obj["wrk"]) acc.push(obj);
    } else acc.push(obj);
    return acc;
  }, []);
}

console.log(getData(objarr, arr1));
console.log(getData(objarr, arr2));
console.log(getData(objarr, arr3)); 
 /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */
.as-console-wrapper { max-height: 100% !important; top: 0; } 

Ответ №3:

Попробуйте это решение:

 function outputData(arr) {
  return objarr.map(obj => Object.fromEntries(arr.map(k => [k, obj[k]])))
}
 

Комментарии:

1. arr2 не дает ожидаемого результата.

Ответ №4:

Поскольку вам нужно выбрать только определенные узлы objarr , переход к Array.map не даст результата. Используйте для этого какую-нибудь другую логику зацикливания.

Я пользовался Array.reduce здесь.

Логические

  • Повторите цикл objarr с помощью Array.reduce .
  • Пройдите через массив пареметров внутри редуктора.
  • Проверьте, соответствует ли значение для каждого узла из массива параметров в объекте в objarr массиве.
  • Если значение истинно, добавьте его к объекту.
  • Если длина ключей этого объекта совпадает с длиной массива параметров, переместите этот объект в накопитель.

Пожалуйста, обратите внимание: Эта логика проверяет истинное значение только для ключа «wrk». Если вы хотите проверить наличие всех логических значений, вы можете использовать условие, добавленное в качестве комментария чуть выше оператора if

 var arr1 = ["name", "place"]
var arr2 = ["details", "wrk"]
var arr3 = ["name"]

var objarr = [
  { id: 1, name: "ayan", place: "MY", details: "finance", wrk: true },
  { id: 2, name: "mike", place: "AU", details: "teaching", wrk: false },
  { id: 3, name: "john", place: "DE", details: "service", wrk: true }
]

function outputData(arr) {
  var result = objarr.reduce((acc, currNode) => {
    const resp = {};
    arr.forEach((option) => {
      // Current condition is only for "wrk"
      // To check truthy state for all boolean variables use the below condition
      // ((typeof currNode[option] === "boolean" amp;amp; currNode[option]) || typeof currNode[option] !== "boolean")
      if ((option === "wrk" amp;amp; currNode[option]) || option !== "wrk") {
        resp[option] = currNode[option]
      }
    })
    if(Object.keys(resp).length === arr.length) {
      acc.push(resp)
    }
    return acc
  }, []);
  return resu<
}
console.log(outputData(arr1));
console.log(outputData(arr2));
console.log(outputData(arr3)); 

Комментарии:

1. arr2 не дает того результата, которого хочет ОП

2. @decpk хороший улов. Я обновил ответ.