在Javascript中从Object.entries中解析数组

时间:2017-07-11 06:14:48

标签: javascript arrays ecmascript-6 destructuring

以下是相关代码:

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))

1 个答案:

答案 0 :(得分:1)

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

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