【问题标题】:how to get new array object based on condition like key exists in javascript如何根据javascript中存在的键等条件获取新的数组对象
【发布时间】:2021-11-13 21:24:49
【问题描述】:

如果键存在于 JavaScript 中,我想知道如何创建一个新的数组对象。

我有两个数组对象,arr1 和 arr2。在arr2中,如果c的值为真且arr1的key与一个值相等,则将其推送到一个新的数组对象中。如果 arr2 的 key-value 为 true 并且与 arr1 的 key 匹配,则在 JavaScript 中推送到一个新数组。

var arr1 = {
    data:[
      {id:1, place: "IN", year: "2020", mode: "ON"},
      {id:3, place: "TH", year: "2022", mode: "OFF"},
      {id:5, place: "AU", year: "2025", mode: "ON"} 
    ]
};
var arr2=[
  {a: "place", c: true},
  {a: "year", c: true},
  {a: "mode", c: false},
]

var finals = [];

var result = arr1.data.map(e=>{
  arr2.forEach(i=>{
    if(i.c == true && Object.keys(e)){
     finals.push(e);
    }
  })
  return finals
})

预期输出:

[
  {place: "IN", year: "2020"}
  {place: "TH", year: "2022"},
  {place: "AU", year: "2025"}
]

【问题讨论】:

  • 如果arr2 的第三行的c 是假的,为什么你期望AU(第三行)?
  • @AzizaKasenova 感谢 fr 的回复,如果不匹配,则应仅删除键,但显示匹配的键,如果键匹配且 c 为真,则应包括
  • if key matched and c true 不适用于AU,因为c 存在错误,@ved
  • 您想映射arr1 中的项目数组以仅显示arr2 中为真的键?
  • @RickardElimää @Aziza Kasenove ,谢谢fr 回复,如果a arr2 的值与 arr1 和 c 匹配,则推送项目,因为模式匹配但 c 是 false ,所以不推送那个键

标签: javascript arrays loops object


【解决方案1】:

你快到了。

  1. arr1.data.map 创建一个新数组,
  2. 为arr1中的每个item创建一个新对象newObj,
  3. 循环遍历arr2 中的每个键
  4. 如果key.c 为真,则在item 中添加具有对应值的key.a
  5. 返回newObj

var arr1 = {
    data:[
      {id:1, place: "IN", year: "2020", mode: "ON"},
      {id:3, place: "TH", year: "2022", mode: "OFF"},
      {id:5, place: "AU", year: "2025", mode: "ON"} 
    ]
};

var arr2=[
  {a: "place", c: true},
  {a: "year",  c: true},
  {a: "mode",  c: false},
];

var result = arr1.data.map(item => {  // 1
  let newObj = {};       // 2

  arr2.forEach(key => {  // 3
    if (key.c) {         // 4
      newObj[key.a] = item[key.a]
    }
  });

  return newObj          // 5
})

console.log(result)

【讨论】:

    【解决方案2】:

    逻辑

    • 从arr2 获取您所需的密钥,条件为node.c === true。
    • map 到 arr1.data 从这个数组中的每个对象中,使用我们从上述逻辑中获得的键创建一个新对象。
    • 此汇总列表将为您提供所需的结果。

    var arr1 = {
      data: [
        { id: 1, place: "IN", year: "2020", mode: "ON" },
        { id: 3, place: "TH", year: "2022", mode: "OFF" },
        { id: 5, place: "AU", year: "2025", mode: "ON" }
      ]
    }
    var arr2 = [
      { a: "place", c: true },
      { a: "year", c: true },
      { a: "mode", c: false },
    ];
    const keys = arr2.filter((node) => node.c).map((node) => node.a);
    var result = arr1.data.map(e => {
      const obj =  keys.reduce((acc, curr) => {
        acc[curr] = e[curr];
        return acc;
      }, {});
      return obj;
    })
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      可以使用.map() 和.reduce() 完成:

      var arr1 = {
          data: [
            {id: 1, place: "IN", year: "2020", mode: "ON"},
            {id: 3, place: "TH", year: "2022", mode: "OFF" },
            {id: 5, place: "AU", year: "2025", mode: "ON" },
          ]
      };
      
      var arr2 = [
          {a: "place", c: true},
          {a: "year", c: true},
          {a: "mode", c: false},
      ];
      
      const result = arr1.data.map(item =>
          Object.keys(item).reduce((acc, key) => {
            const isEnabled = arr2.some(({a, c}) => a === key && c === true);
            return isEnabled ? { ...acc, [key]: item[key]} : acc;
          }, {})
      );
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        reduce 和 forEach 方法:

        let arr1 = { data: [{ id: 1, place: "IN", year: "2020", mode: "ON" }, { id: 3, place: "TH", year: "2022", mode: "OFF" }, { id: 5, place: "AU", year: "2025", mode: "ON" }] };
        let arr2 = [{ a: "place", c: true }, { a: "year", c: true }, { a: "mode", c: false }, ]
        
        let finals = arr1.data.reduce((acc, itm) => {
          let obj = {};
          arr2.forEach(({a, c}) => {
            if (c) obj[a] = itm[a];
          })
          acc.push(obj)
          return acc
        }, [])
        
        console.log(finals)

        【讨论】:

          【解决方案5】:

          忍不住添加另一个版本,使用Object.fromEntries

          const arr1 = {    data:[      {id:1, place: "IN", year: "2020", mode: "ON"},      {id:3, place: "TH", year: "2022", mode: "OFF"},      {id:5, place: "AU", year: "2025", mode: "ON"}     ]};
          const arr2=[  {a: "place", c: true},  {a: "year", c: true},  {a: "mode", c: false},]
          
          
          
          const props = arr2.flatMap(p=> p.c ? p.a : []);
          const finals = arr1.data.map(o=> Object.fromEntries(props.map(p=>[p,o[p]])));
          
          console.log(finals);

          【讨论】:

            猜你喜欢
            • 2020-10-28
            • 2021-09-13
            • 1970-01-01
            • 2020-12-04
            • 1970-01-01
            • 2021-12-22
            • 2022-01-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多