使用array.some仅返回匹配的子对象

时间:2017-07-27 10:58:28

标签: javascript arrays ecmascript-6

我有一个我要传递给函数的请求颜色列表:

const requestedColours = ['blue','green'];

我把它传递给一个函数,该函数包含一个具有各种颜色细节的对象:

colorOptions(requestedColours) {
    const options = {
        blue: {
            icon: 'sea.jpg',
            title: 'Sea Blue',
        },
        green: {
            icon: 'leaf.jpg',
            title: 'Leafy green',
        },
        pink: {
            icon: 'flower.jpg',
            title: 'Rose Pink',
        }
     }

    return options.some(requestedColours);
}

我知道以下行不正确:

return options.some(requestedColours);

但是我也尝试过,例如:

return options.some('blue');

这不会返回blue的子对象,如何正确使用array.some

3 个答案:

答案 0 :(得分:1)

Array#reduce超过requestedColours数组。

注意:明智的想法是将options对象移到函数外部。

const requestedColours = ['blue', 'green'];
const options = {
  blue: {
    icon: 'sea.jpg',
    title: 'Sea Blue',
  },
  green: {
    icon: 'leaf.jpg',
    title: 'Leafy green',
  },
  pink: {
    icon: 'flower.jpg',
    title: 'Rose Pink',
  }
};

const colorOptions = (obj, arr) => {
  return requestedColours.reduce((s, a) => {
    if (a in options) {
      s[a] = obj[a];
    }
    return s;
  }, {});
};

console.log(colorOptions(options, requestedColours));

答案 1 :(得分:0)

some函数接受一个函数并使用它来测试数组的每个元素。如果函数对于数组的任何元素返回true,则返回true。例如,如果我想检查一个数组是否包含至少一个大于5的元素,我可能会尝试:

[1, 2, 5, 7].some(function(elem) { return elem > 5; })

我不太确定您在上述功能中想要达到的目标,但我不认为some功能符合您的需求。

答案 2 :(得分:0)

somearray原型中采用函数并返回truefalse的方法。它使用数组中的项运行函数,直到它返回truthy值。如果没有,则返回false

如果您的目标是查看requestedColors是否在options中:

  • 定义一个函数,告诉您某个键是否在对象中
  • 将此功能传递给some

即:



var requestedColours=["blue","green"];
var options={blue:{icon:"sea.jpg",title:"Sea Blue"},green:{icon:"leaf.jpg",title:"Leafy green"},pink:{icon:"flower.jpg",title:"Rose Pink"}};

var objectHasKey = obj => key => key in obj;

console.log(
  requestedColours.some(objectHasKey(options))
);




如果您的目标是创建一系列请求的选项:

  • 定义一个从对象中检索属性值的函数
  • 使用map从键映射到选项
  • 过滤掉不存在的选项



var requestedColours=["red", "blue","green"];
var options={blue:{icon:"sea.jpg",title:"Sea Blue"},green:{icon:"leaf.jpg",title:"Leafy green"},pink:{icon:"flower.jpg",title:"Rose Pink"}};

var getKey = obj => key => obj[key];

console.log(
  requestedColours
    .map(getKey(options))
    .filter(opt => opt)
);




如果您的目标是创建仅包含所请求颜色的新选项对象:

您可以使用一个reduce方法在一个循环中执行此操作:

  • 减少requestedColours
  • 使用密钥
  • options检索选项对象
  • 将它与您在reducer中传递的累加器合并



const requestedColours = ['blue', 'green'];
const options = {
  blue: {
    icon: 'sea.jpg',
    title: 'Sea Blue',
  },
  green: {
    icon: 'leaf.jpg',
    title: 'Leafy green',
  },
  pink: {
    icon: 'flower.jpg',
    title: 'Rose Pink',
  }
}

const pickedColors = requestedColours.reduce(
  (picked, key) => Object.assign(picked, { [key]: options[key] }),
  {}
);

console.log(pickedColors);