我如何`.filter()`数组/对象并返回带有原始键的新数组,而不是作为过滤器返回的索引数组/对象?

Ric*_*hez 4 javascript functional-programming ecmascript-6

var obj = {

    111: {
        user_id: 111,
        user_name: "user111",
        isActive: 0
    }, 
    112: {
        user_id: 112,
        user_name: "use112",
        isActive: 1
    }, 
    113: {
        user_id: 113,
        user_name: "use113",
        isActive: 0
    }, 
    ... 
}
Run Code Online (Sandbox Code Playgroud)

我想过滤所有内容,("isActive" === 0)但在返回newObj时保持键集相同(其值等于用户ID):

newObj = {

    111: {
        user_id: 111,
        user_name: "user111",
        isActive: 0
    }, 
    113: {
        user_id: 113,
        user_name: "use113",
        isActive: 0
    }, 
    ... 
}
Run Code Online (Sandbox Code Playgroud)

这就是我现在所拥有的:

let newObj = Object.values(obj).filter( user => ( (obj.isActive === 0)));
Run Code Online (Sandbox Code Playgroud)

返回索引键

  • 否for循环(除非.forEach()必须使用ES6 )。
  • 我希望在这种情况下使用filter / map / reduce来解决此问题的ES6方法。
  • loadash方法还可以,但我仍然想在之前看到一个“香草ES6”示例
  • 如果我能找到使用这些方法以各种方式最好地学习和练习如何过滤阵列的方法(loadash在这里也很酷)。

T.J*_*der 6

真正的FP方式是reduce重复对象扩散:

const filtered = Object.values(obj).reduce((p, e) => (!e.isActive ? {...p, [e.user_id]: e} : p), {});
Run Code Online (Sandbox Code Playgroud)

const filtered = Object.values(obj).reduce((p, e) => (!e.isActive ? {...p, [e.user_id]: e} : p), {});
Run Code Online (Sandbox Code Playgroud)
const obj = {
    111: {
        user_id: 111,
        user_name: "user111",
        isActive: 0
    }, 
    112: {
        user_id: 112,
        user_name: "use112",
        isActive: 1
    }, 
    113: {
        user_id: 113,
        user_name: "use113",
        isActive: 0
    }
};
const filtered = Object.values(obj).reduce((p, e) => (!e.isActive ? {...p, [e.user_id]: e} : p), {});
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)

这会创建很多不必要的临时对象,但是通过不修改对象来遵守FP原则(我认为,我对FP并不“深入” :)。

稍微修改一下规则,我们可能会修改单个对象,而不是创建大量临时对象:

const filtered = Object.values(obj).reduce((newObj, e) => {
  if (!e.isActive) {
    newObj[e.user_id] = e;
  }
  return newObj;
}, {});
Run Code Online (Sandbox Code Playgroud)

.as-console-wrapper {
  max-height: 100% !important;
}
Run Code Online (Sandbox Code Playgroud)
const filtered = Object.values(obj).reduce((newObj, e) => {
  if (!e.isActive) {
    newObj[e.user_id] = e;
  }
  return newObj;
}, {});
Run Code Online (Sandbox Code Playgroud)

(通过滥用逗号运算符,可以用更少的字符来编写该代码,但它的维护性较差,并且更难阅读。)

没有FP限制,我只是使用一个循环:

const filtered = {};
for (const e of Object.values(obj)) {
  if (!e.isActive) {
    filtered[e.user_id] = e;
  }
}
Run Code Online (Sandbox Code Playgroud)

const obj = {
    111: {
        user_id: 111,
        user_name: "user111",
        isActive: 0
    }, 
    112: {
        user_id: 112,
        user_name: "use112",
        isActive: 1
    }, 
    113: {
        user_id: 113,
        user_name: "use113",
        isActive: 0
    }
};
const filtered = Object.values(obj).reduce((newObj, e) => {
  if (!e.isActive) {
    newObj[e.user_id] = e;
  }
  return newObj;
}, {});
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper {
  max-height: 100% !important;
}
Run Code Online (Sandbox Code Playgroud)