如何过滤对象数组但更改顺序

时间:2018-12-06 09:33:51

标签: javascript arrays ecmascript-6

假设我有一个object []数组和一个数字数组。

let objects = [
{name: apple, id:1},
{name: banana, id:2},
{name: orange, id:5}
];

let numbers = [5, 1];

我要过滤对象数组,因此仅保留与数字匹配的id,并且应该更改顺序以匹配数字数组。

result should be [{name: orange, id:5} , {name: apple, id:1} ]

我可以使用javascript对象原型吗?还是可以使用lodash等第三方工具?

我尝试使用下面的代码,但是它保持原始列表的顺序:

result = object.filter(p => {
    return numbers.includes(parseInt(p.id));
});

4 个答案:

答案 0 :(得分:2)

您可以通过找到对象来映射所需的物品。

var objects = [{ name: 'apple', id: 1 }, { name: 'banana', id: 2 }, { name: 'orange', id: 5 }],
    numbers = [5, 1],
    result = numbers.map(id => objects.find(o => o.id === id));

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

答案 1 :(得分:2)

它保持顺序,因为您可以遍历对象。如果要使用数字顺序,则必须遍历数字。

您没有说数字中的ID是否必须存在于对象中,即使一个流浪ID进入数字中,我的解决方案仍然有效

let result = []
numbers.forEach(
        element => { if (objects.find(anObject => anObject.id == element))
                         result.push(objects.find(anObject => anObject.id == element)) })

答案 2 :(得分:1)

Array.mapArray.find。您不需要Array.filter

const items = [{name: 'apple', id:1}, {name: 'banana', id:2}, {name: 'orange', id:5}]

const numbers = [5, 1]

const result = numbers.map(n => items.find(i => i.id === n))

console.log(result)

由于要在numbers上进行映射,因此result数组的顺序与numbers相同。

答案 3 :(得分:1)

checkObject(obj, arr) {
 let x;
 for (x in arr) {
    if(arr[x].id == obj.id){
      return true;
     }
 }
 return false;
}

let items = [{name: 'apple', id:1}, {name: 'banana', id:2}, {name: 'orange', id:5}]
let numbers = [5, 1];
checkObject(items, numbers);

您可以尝试使用此功能来检查您的数字数组是否与对象数组匹配。