【问题标题】:Array destructing from Object.entries in JavascriptJavascript 中 Object.entries 的数组解构
【发布时间】:2017-12-15 01:18:30
【问题描述】:

这里是有问题的代码:

const posts = [{
  data: {
    id: 1,
    date: "2019-02-03",
    ev_filter_1: ["art", "foodie"],
    ev_filter_2: ["value1", "value2"],
    ev_filter_3: ["value1", "value2"],
    ev_filter_4: ["all", "12+"]
  }
},
  {
    data: {
      id: 2,
      date: "",
      ev_filter_1: ["arti", "foodie"],
      ev_filter_2: ["value1", "value2"],
      ev_filter_3: ["value1", "value2"],
      ev_filter_4: ["all", "19+"]
    }
  },
  {
    data: {
      id: 3,
      date: "2019-02-03",
      ev_filter_1: ["art", "foodie"],
      ev_filter_2: ["value1", "value75"],
      ev_filter_3: ["value1", "value2"],
      ev_filter_4: ["all", "12+"]
    }
  }
];

function sift2(arrObjLit, pattern, ...values) {
  const toMatch = new Set(values)
  const result = arrObjLit.map(o => o.data)
  .filter(o =>
      Object.entries(o)
      .filter(([k, v]) => {
        console.log(`${k}: ${v}`)
        return true
      })
      .filter(([k, v]) => k.startsWith(pattern))
      .filter(([k, v]) => Array.isArray(v))
      .filter(([k, v]) => toMatch.has(v))
          .length > 0
  )
  return result;
}

console.log(...sift2(posts, "ev_", "value75", "12+"));

这让我很困惑。基于this post 我希望filter 中的数组破坏是错误的。然而,事实并非如此。这正是我正在寻找的。为什么 filter 方法中的破坏是平坦的?我是不是观察错了?

.filter(o =>
      Object.entries(o)
      .filter(([k, v]) => k.startsWith(pattern))

【问题讨论】:

  • 你所说的“解构是扁平的”是什么意思?
  • toMatch 是一组字符串且v 是一个数组时,toMatch.has(v) 不起作用。

标签: javascript arrays ecmascript-6 destructuring


【解决方案1】:

因为您现在正确嵌套了迭代,所以直接在entries 的输出上调用第二个filter。请注意,您正在使用

.filter(o => Object.entries(o).filter(…).… )

而不是

.map(Object.entries).filter(o => o.… )

也就是说,我会将你的函数重写为

function sift2(arrObjLit, pattern, ...values) {
  const toMatch = new Set(values)
  return arrObjLit.filter(o =>
    Object.entries(o.data)
    .some(([k, v]) => {
      console.log(`${k}: ${v}`);
      return k.startsWith(pattern)
          && Array.isArray(v)
          && v.some(x => toMatch.has(x));
    })
  );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2017-06-11
    • 1970-01-01
    相关资源
    最近更新 更多