【问题标题】:return array from comparing to arrays _ lodash从比较数组中返回数组_lodash
【发布时间】:2019-04-16 11:32:03
【问题描述】:
let a =  [{
    a:1,
    b:3,
    c:[1, 2, 6]
    },
 {
    a:3,
    b:10,
    c:[2, 5, 4]
    },
 {
    a:4,
    b:3,
    c:[7, 12, 6]
    },
 {
    a:4,
    b:12,
    }]

let b = [2, 6]

我想从 a 对象返回一个与 b 数组匹配的数组。

我用过:

lodash.forEach(b , (value)=>{
   lodash.filter(a, {c: value})
}

但这不起作用。我试图简化我的代码以便更好地理解。

【问题讨论】:

  • 预期输出是什么?
  • 期望 c.values 与第二个数组共有的对象
  • 你希望输出是什么?
  • @babakabadkheir - 还是不清楚,你能分享一下回复吗?

标签: javascript arrays object lodash


【解决方案1】:

您可以通过查看b 的值是否包含在c 中来过滤数组。

var a = [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }],
    b = [2, 6],
    result = a.filter(({ c = [] }) => b.some(v => c.includes(v)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

为了只获取完全匹配的项目,您可以使用Array#every 而不是Array#some

var a = [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }],
    b = [2, 6],
    result = a.filter(({ c = [] }) => b.every(v => c.includes(v)));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    要查找包含所有 b 值的 c 的对象,您可以使用 Array.filter()Array.every()

    let a =  [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }];
    
        let b = [2, 6]
    
        console.log(a.filter(({c = []}) => b.every(v => c.includes(v)))); 

    如果您想要通用值,请使用 Array.some() 而不是 Array.every()

    let a =  [{ a: 1, b: 3, c: [1, 2, 6] }, { a: 3, b: 10, c: [2, 5, 4] }, { a: 4, b: 3, c: [7, 12, 6] }, { a: 4, b: 12 }];
    
            let b = [2, 6]
    
            console.log(a.filter(({c = []}) => b.some(v => c.includes(v)))); 

    【讨论】:

      【解决方案3】:

      我相信这就是你想要的——你可以用纯 JS 做到:

       
      
      let a =  [{
      a:1,
      b:3,
      c:[1, 2, 6]
      },
       {
      a:3,
      b:10,
      c:[2, 5, 4]
      },
       {
      a:4,
      b:3,
      c:[7, 12, 6]
      },
       {
      a:4,
      b:12,
      }]
      
      let b = [2, 6]
      
      let c = a.filter(({ c = [] }) => c ? b.some(n => c.includes(n))) : false;
      
      console.log(c);

      【讨论】:

        【解决方案4】:

        假设您要过滤数组a 中的对象,这些对象在c 中至少有一个值,该值存在于b 数组中。

        您可以使用Array.filterArray.someArray.includes

        let a=[{a:1,b:3,c:[1,2,6]},{a:3,b:10,c:[2,5,4]},{a:4,b:3,c:[7,12,6]},{a:4,b:12,}];
        let b=[2,6];
        
        let result = a.filter(v => v.c && v.c.some(v1 => b.includes(v1)));
        console.log(result);

        你可以如下使用lodash

        let a=[{a:1,b:3,c:[1,2,6]},{a:3,b:10,c:[2,5,4]},{a:4,b:3,c:[7,12,6]},{a:4,b:12,}];
        let b=[2,6];
        
        let result = _.filter(a, v => v.c && _.some(v.c, c => _.includes(b,c)));
        console.log(result);
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-06
          • 1970-01-01
          • 2017-06-08
          • 2020-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多