【问题标题】:Iterating and filtering with ES6/lodash使用 ES6/lodash 进行迭代和过滤
【发布时间】:2018-09-27 00:53:18
【问题描述】:

我们有一个对象数组,例如:

const persons = [{
    name: "john",
    age: 23
}, {
    name: "lisa",
    age: 43
}, {
    name: "jim",
    age: 101
}, {
    name: "bob",
    age: 67
}];

以及object中对象的一个​​属性值的数组

const names = ["lisa", "bob"]

我们如何使用 es6 在 names 数组中找到有名字的人,例如:

const filteredPersons = [{
    name: "lisa",
    age: 43
}, {
    name: "bob",
    age: 67
}];

【问题讨论】:

    标签: javascript ecmascript-6 lodash


    【解决方案1】:

    ES6

    filter 函数与谓词一起使用,并在其中检查names 数组中的名称是否存在。

    const persons = [
        {name: "john", age:23},
        {name: "lisa", age:43},
        {name: "jim", age:101},
        {name: "bob", age:67}
    ];
    
    const names = ["lisa", "bob"];
    
    const filtered = persons.filter(person => names.includes(person.name));
    
    console.log(filtered);

    【讨论】:

    • @dandavis 它只是比较整个单词。但它完全符合要求。
    • @dandavis 它只是比较单词。 includes 与数组相关,而不是字符串。不要混淆。数组是否包含那个词? - 这样
    • doh!,对不起,我的睡觉时间已经过去了。
    【解决方案2】:

    lodash

    你可以试试关注

    const persons = [{name: "john", age: 23},
        {name: "lisa",age: 43}, 
        {name: "jim", age: 101}, 
        {name: "bob",age: 67}];
    
    
    const names = ["lisa", "bob"]
    
    
    const filteredPersons = _.filter(persons, function(person) {
        return _.indexOf(names, person.name) !== -1;
    });
    
    console.log(filteredPersons);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

    【讨论】:

      【解决方案3】:

      您可以使用filter()inlcudes() 来获得所需的结果。

      演示

      const persons = [{
        name: "john",
        age: 23
      }, {
        name: "lisa",
        age: 43
      }, {
        name: "jim",
        age: 101
      }, {
        name: "bob",
        age: 67
      }];
      const names = ["lisa", "bob"];
      
      console.log(persons.filter(({
        name
      }) => names.includes(name)))
      .as-console-wrapper { max-height: 100% !important; top: 0; }

      【讨论】:

        【解决方案4】:

        如果您想以n 的复杂性执行它,这里有一种方法:

        1. 创建一个地图,其中键作为人名,值作为人的对象。
        2. 映射条件数组并从步骤 1 中创建的映射中提取人员对象。

        这是一个工作演示:

        const persons = [{
          name: "john",
          age: 23
        }, {
          name: "lisa",
          age: 43
        }, {
          name: "jim",
          age: 101
        }, {
          name: "bob",
          age: 67
        }];
        
        const names = ["lisa", "bob"];
        const map = persons.reduce((acc, item) => {
          acc[item.name] = item;
          return acc;
        }, {});
        const result = names.map(name => map[name]);
        console.log(result);

        注意:此解决方案假定源数组中只有唯一的人名。需要对其进行调整以处理重复项。

        【讨论】:

        • 如果您使用reducenamesfilterpersons,您可以获得等效的time complexity。这样的策略还允许多个persons 共享同一个name 而不是overwritten
        • @ArmanCharan -- 嗯,我没有让你完全正确。你能详细说明一下吗?
        • 您当前的策略实现了O(n*m) 的复杂性,但侧重于hash tabling persons 而不是names。正如您所指出的:这意味着multiple persons 不能与same name 一起使用。如果您将hash 改为names:您的算法将具有相同的time complexity 并能够使用same name 处理multiple peopleExample.
        【解决方案5】:

        我建议使用indexOf,因为includes 在IE 浏览器中不起作用。此外,使用 {name} 作为解构赋值,它将保存对象的 name 属性的值。

        const persons = [{
          name: "john",
          age: 23
        }, {
          name: "lisa",
          age: 43
        }, {
          name: "jim",
          age: 101
        }, {
          name: "bob",
          age: 67
        }];
        const names = ["lisa", "bob"];
        
        console.log(persons.filter(({name}) => names.indexOf(name) !== -1))

        【讨论】:

          【解决方案6】:

          有关详细信息,请参阅 ClosuresSetArray.prototype.filter()

          // Input.
          const persons = [{name: "john",age: 23}, {name: "lisa",age: 43}, {name: "jim",age: 101}, {name: "bob",age: 67}]
          const names = ["lisa", "bob"]
          
          // Filter.
          const filter = (A, B) => (s => A.filter(x => s.has(x.name)))(new Set(B))
          
          // Output.
          const output = filter(persons, names)
          
          // Proof.
          console.log(output)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-18
            • 1970-01-01
            • 1970-01-01
            • 2021-07-14
            • 2022-01-06
            相关资源
            最近更新 更多