【问题标题】:How to get array of objects only if array values matches with object array key仅当数组值与对象数组键匹配时如何获取对象数组
【发布时间】:2021-11-27 04:38:43
【问题描述】:

我有数组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"}
]

【问题讨论】:

    标签: javascript arrays loops object


    【解决方案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】:

      由于您只需要从objarr 中选择特定节点,因此选择Array.map 不会给出结果。为此使用其他一些循环逻辑。

      我在这里使用了Array.reduce

      逻辑

      • 循环通过objarrArray.reduce
      • 循环遍历 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" && currNode[option]) || typeof currNode[option] !== "boolean")
            if ((option === "wrk" && currNode[option]) || option !== "wrk") {
              resp[option] = currNode[option]
            }
          })
          if(Object.keys(resp).length === arr.length) {
            acc.push(resp)
          }
          return acc
        }, []);
        return result;
      }
      console.log(outputData(arr1));
      console.log(outputData(arr2));
      console.log(outputData(arr3));

      【讨论】:

      • arr2 没有给出 OP 想要的结果
      • @decpk 不错。我已经更新了答案。
      【解决方案3】:

      您可以使用reducefor..of 循环轻松实现结果

      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; }

      【讨论】:

        【解决方案4】:

        试试这个解决方案:

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

        【讨论】:

        • arr2 没有给出预期的输出。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        • 1970-01-01
        • 1970-01-01
        • 2016-06-19
        • 1970-01-01
        相关资源
        最近更新 更多